Ubuntu 16.04环境下无法卸载Python2.7的pip安装包
你尝试清除所有通过pip安装的Python2.7包,使用了这条命令:
sudo pip freeze | xargs pip uninstall -y
但遇到了权限拒绝的错误:
Uninstalling pandocfilters-1.4.2: Exception: Traceback (most recent call last): File "/usr/local/lib/python2.7/dist-packages/pip/_internal/basecommand.py", line 228, in main status = self.run(options, args) File "/usr/local/lib/python2.7/dist-packages/pip/_internal/commands/uninstall.py", line 68, in run auto_confirm=options.yes, verbose=self.verbosity > 0, File "/usr/local/lib/python2.7/dist-packages/pip/_internal/req/req_install.py", line 661, in uninstall uninstalled_pathset.remove(auto_confirm, verbose) File "/usr/local/lib/python2.7/dist-packages/pip/_internal/req/req_uninstall.py", line 219, in remove renames(path, new_path) File "/usr/local/lib/python2.7/dist-packages/pip/_internal/utils/misc.py", line 273, in renames shutil.move(old, new) File "/usr/lib/python2.7/shutil.py", line 303, in move os.unlink(src) OSError: [Errno 13] Permission denied: '/usr/local/lib/python2.7/dist-packages/pandocfilters-1.4.2.dist-info/DESCRIPTION.rst'
出现这个问题的核心是权限继承问题:你只给了前面的sudo pip freeze命令root权限,但管道|后面的pip uninstall -y并没有获得sudo权限,所以当它要修改/usr/local/lib下的系统级文件时,就会触发权限拒绝的错误。
这里有两个靠谱的解决方法:
方法一:让整个命令链都获取sudo权限
把整个命令用sudo sh -c包裹起来,这样管道前后的所有命令都会在root权限下执行:sudo sh -c 'pip freeze | xargs pip uninstall -y'原理是
sh -c会把单引号里的内容当作一个完整的shell脚本执行,而sudo给这个shell进程赋予了root权限,自然所有子命令都能拿到足够权限。方法二:分步执行(更稳妥)
如果担心一次性卸载所有包可能出意外,可以先导出包列表,再用sudo批量卸载:- 先导出已安装的Python2.7包列表:
pip freeze > python2_packages.txt - 然后用sudo执行卸载命令:
sudo xargs pip uninstall -y < python2_packages.txt
这个方法能让你随时查看要卸载的包列表,万一中间出错也更容易排查。
- 先导出已安装的Python2.7包列表:
另外提一句:Python2.7已经停止维护好几年了,存在不少安全漏洞,建议你尽快迁移到Python3版本哦!
内容的提问来源于stack exchange,提问作者nikhilbalwani

