我已经阅读了一些注释,表明使用 sudo 命令进行 pip 升级不是一个好主意。我的问题是,如果我不提供 sudo,我会收到权限错误。我该如何解决这个问题?另外,不建议使用 sudo 来升级 pip 的原因是什么?
$python -m pip install --upgrade pip
DEPRECATION: Python 2.7 will reach the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 won't be maintained after that date. A future version of pip will drop support for Python 2.7. More details about Python 2 support in pip, can be found at https://pip.pypa.io/en/latest/development/release-process/#python-2-support
Collecting pip
Using cached https://files.pythonhosted.org/packages/54/0c/d01aa759fdc501a58f431eb594a17495f15b88da142ce14b5845662c13f3/pip-20.0.2-py2.py3-none-any.whl
Installing collected packages: pip
Found existing installation: pip 19.2.3
Uninstalling pip-19.2.3:
Successfully uninstalled pip-19.2.3
Rolling back uninstall of pip
Moving to /home/abc/.local/bin/pip
from /tmp/pip-uninstall-V4F8Pj/pip
Moving to /home/abc/.local/bin/pip2
from /tmp/pip-uninstall-V4F8Pj/pip2
Moving to /home/abc/.local/bin/pip2.7
from /tmp/pip-uninstall-V4F8Pj/pip2.7
Moving to /home/abc/.local/lib/python2.7/site-packages/pip-19.2.3.dist-info/
from /home/abc/.local/lib/python2.7/site-packages/~ip-19.2.3.dist-info
Moving to /home/abc/.local/lib/python2.7/site-packages/pip/
from /home/abc/.local/lib/python2.7/site-packages/~ip
ERROR: Could not install packages due to an EnvironmentError: [Errno 13] Permission denied: '/usr/local/lib/python2.7/dist-packages/pip-20.0.2.dist-info/top_level.txt'
Consider using the `--user` option or check the permissions.
WARNING: You are using pip version 19.2.3, however version 20.0.2 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
答案1
切勿在软件包管理系统之外升级操作系统提供的工具版本,因为如果发布了新软件包,它将覆盖您的更改。
也是sudo pip install --upgrade pip
一件坏事。操作系统包系统认为它控制着这些文件,而您已经覆盖了它们。可能会导致奇怪的行为,包括安装较老的版本比您之前安装的版本高!
如果您想要更新的版本,可以将其安装在用户配置文件中
% pip install --upgrade --user pip
Collecting pip
Downloading https://files.pythonhosted.org/packages/54/0c/d01aa759fdc501a58f431eb594a17495f15b88da142ce14b5845662c13f3/pip-20.0.2-py2.py3-none-any.whl (1.4MB)
100% |################################| 1.4MB 615kB/s
Installing collected packages: pip
Successfully installed pip-20.0.2
这将安装最新版本$HOME/.local/bin
% ls -l .local/bin/pip
-rwxr-xr-x 1 sweh sweh 223 Feb 16 21:49 .local/bin/pip
如果您$HOME/.local/bin
的 PATH 中有,那么您将始终选择用户 pip 安装的程序。
然而,大多数时候,你并不需要升级pip
。
答案2
添加到 Stephens 的答案中,您也不应该使用 pip (即sudo pip install foo
)全局安装软件包。与升级 pip 一样,这会干扰发行版提供的文件,从而导致潜在的冲突。
对于 Debian 上的 Python 包,有两种可行的策略,不应混合使用。选一个。您可以根据情况需要从一种切换到另一种。
1) 仅使用 Debian 提供的软件包
也就是说,你可以做任何事apt install
。需要 PIL 吗?apt install python-pil
或者apt install python3-pil
。这可以确保所有文件都由 Debian 正确管理,并且您可以获得免费的安全支持以及 Debian 的其他软件包。好吧,无论如何,直到 7 月左右,Stretch 将开始失去安全支持。
这意味着您有时不得不接受较旧版本的软件包。有时您可能根本找不到您需要的包。也许这可以通过使用斯蒂芬描述的方式安装的软件包来补充pip --user
,我还没有尝试过。
2)使用虚拟环境
您可以设置 Python 虚拟环境 ( sudo apt install virtualenv; virtualenv venv; source venv/bin/activate
)。您可以在此 virtualenv 中安装软件包(或升级 pip),并且所有此类安装将完全包含在该 virtualenv 中。这也意味着您可以为不同的项目使用不同版本的包,并且 PyPi 上的任何内容都可用。rm -r venv/
将删除整个虚拟环境,包括任何软件包。与操作系统文件不冲突。
这种方法使您的项目需求更加明确,并使管理变得更加容易。另一方面,更新这些软件包以进行安全修复的负担就由您承担了。对于小型一次性项目来说,这有点繁琐,但在特定情况下却非常有用。