在Amazon Linux上升级pip

39

我想在Amazon Linux AMI 2015.09.1上部署我的Python应用程序,该系统自带Python2.7(默认)和pip(版本为6.1.1)。然后,我使用以下命令升级了pip:

sudo pip install -U pip

但是,它似乎出现了故障,并在我尝试安装软件包时显示了该消息:

pkg_resources.DistributionNotFound: pip==6.1.1

我发现pip会删除位于/usr/bin/的旧文件,并在/usr/local/bin中安装新文件。因此,我尝试使用以下命令指定位置:

sudo pip install -U --install-option="--prefix='/usr/bin'" pip

尽管如此,它仍然将新版本安装在/usr/local/bin中。除此之外,pip不能与sudo很好地配合使用,尽管它已经成功安装。错误信息:

sudo: pip2.7: command not found

有没有一种正确管理pip的方法?


1
不要使用sudo,/usr/local/bin是pip的正确位置。 - abolotnov
@abolotnov 如果没有使用sudo,它总是显示错误消息。消息内容为:Permission denied: '/usr/local/lib/python2.7/site-packages/xxxxx.py' - zeck
@abolotnov 看起来没有这个目录(/usr/lib/local)。 - zeck
我使用virtualenv管理pip,不再需要sudo。 - SnoopyGuo
@zeck йВ£жШѓ /usr/local/libпЉИеѓєеЇФдЇО /usr/local/binпЉМдЄО /usr/lib еТМ /usr/bin зЫЄеѓєеЇФпЉЫињШжЬЙ /usr/local/man еТМ MANPATHпЉЙгАВ - Elliott Frisch
显示剩余3条评论
8个回答

52

尝试:

sudo which pip

这可能会显示类似于“($PATH)中没有pip”的内容。

如果是这种情况,您可以执行以下操作:

which pip

这将使您获得类似于/usr/local/bin/pip的路径。

通过运行以下命令,将pip路径复制到sbin文件夹中:sudo cp /usr/local/bin/pip /usr/sbin/

这将允许您无误地运行sudo pip


26

我曾经为此奋斗一段时间,这是我找到的结果:

  • ec2_user 可以找到 pip 可执行文件,但由于 /usr/local/lib/python2.7/site-packages 文件夹中的 pip 文件夹没有被 other 读取/执行权限而导致模块导入错误。实际上这没关系,因为在大多数情况下,如果不以 root 身份运行,pip 安装都会失败。
  • sudo 找不到 pip
  • 使用 sudo su - 进入 root 后,可以正常运行 pip

sudo pip 升级后无法正常工作的原因是因为可执行文件(或符号链接)从 /usr/bin 中移除了。但是,还剩下一个名为 pip-27 的文件,其中包含以下内容:

#!/usr/bin/python2.7
# EASY-INSTALL-ENTRY-SCRIPT: 'pip==6.1.1','console_scripts','pip2.7'
__requires__ = 'pip==6.1.1'
import sys
from pkg_resources import load_entry_point

if __name__ == '__main__':
    sys.exit(
        load_entry_point('pip==6.1.1', 'console_scripts', 'pip2.7')()
    )

因此,这就是我们的错误来自的地方,因为升级显然没有清理该文件。不太清楚从哪里将名称转换从 pippip-2.7

如另一个答案中所述,在升级后,pip 现在存在于 /usr/local/bin 中,这不再是 sudo 安全路径。您可以通过运行 sudo visudo 将此路径添加到 secure_path 变量中。如果您不想将该路径添加到您的 secure_path 中,则另一种选择是在/usr/bin 中创建新的 pip 可执行文件的符号链接。


很好的解释@Sector95。找到了根本原因。这应该是被接受的答案。 - Pramit

9
问题部分得到了您的问题的回答。Amazon AMI不认为/usr/local/bin是根帐户的PATH的一部分。您可以通过更新根帐户的~/.bashrc来解决此问题,以包括它。
类似于这样的内容... export PATH=$PATH:/usr/local/bin

/usr/local/bin 已经在 PATH 中,但 AWS Linux 没有看到它。我运行了你的命令,现在 pip 可以工作了。不确定实际上有什么不同,但现在它可以工作了! - Evan

8

在苦苦挣扎了数小时并阅读了评论后,

which pip 显示 /usr/bin/pip ,但实际的 pip 位于 /usr/local/bin/pip,这是由于 pip 升级和清理未完成导致的。

所以需要删除 /usr/bin/ 中的 pip:

sudo rm /usr/bin/pip

并将新的 pip 添加到您的导出路径中:

vim ~/.bash_profile

PATH=$PATH:$HOME/bin:/usr/local/bin

退出终端,并重新登录

which pip 应该显示 /usr/local/bin/pip

pip install --upgrade pip

3
为了补充angelokh的观点,
sudo `which pip` install --upgrade pip

3

这对我有效

sudo /usr/local/bin/pip install --upgrade pip

2
我认为在这种情况下最好的策略是将 pip 作为虚拟环境的一部分来管理,使用 virtualenv,而不是去搞系统级别的版本。
如果您同意这个方案,这是基本的想法:
以下是英文文本的翻译:
  1. 安装与要升级到的版本的 pip 打包在一起的版本的 virtualenv 到系统级别的 pip 上(例如,virtualenv==15.1.0pip==9.0.1 一起提供):

    $ sudo pip install -U virtualenv==15.1.0
    You are using pip version 6.1.1, however version 9.0.1 is available.
    You should consider upgrading via the 'pip install --upgrade pip' command.
    Collecting virtualenv==15.1.0
      Downloading virtualenv-15.1.0-py2.py3-none-any.whl (1.8MB)
        100% |████████████████████████████████| 1.8MB 135kB/s
    Installing collected packages: virtualenv
      Found existing installation: virtualenv 12.0.7
        Uninstalling virtualenv-12.0.7:
          Successfully uninstalled virtualenv-12.0.7
    Successfully installed virtualenv-15.1.0
    

    我使用 virtualenv 发布说明 找出哪个版本的 pip 对应哪个版本的 virtualenv

  2. 创建虚拟环境:

    $ virtualenv myenv
    New python executable in /home/ec2-user/myenv/bin/python2.7
    Also creating executable in /home/ec2-user/myenv/bin/python
    Installing setuptools, pip, wheel...done.
    
  3. 激活虚拟环境并确认升级后的 pip 的版本和位置:

    $ source myenv/bin/activate
    (myenv) $ pip -V
    pip 9.0.1 from /home/ec2-user/myenv/local/lib/python2.7/dist-packages (python 2.7)
    (myenv) $ which pip
    ~/myenv/bin/pip
    
这样做可以让你使用你选择的 pip 版本在此 virtualenv 中安装软件包,而无需使用 sudo

1
我认为您没有安装 pythonXX-pip 包。
我直接升级到了 Python3.4,这些命令对我有用。
sudo su
yum install python34
yum install python34-pip

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接