【问题标题】:Python easy_install in a virtualenv gives setuptools errorvirtualenv 中的 Python easy_install 给出了 setuptools 错误
【发布时间】:2014-03-11 01:26:33
【问题描述】:

还有许多与此类似的其他 StackOverflow 问题,但在每种情况下,平台不同或错误消息不同或解决方案无效或已过时。我正在尝试设置 Python 2.7.6 virtualenv 并将模块安装到其中,但 easy_install 给我的错误表明 setuptools 不可用。但是 AFAIK easy_install 是 setuptools 的一部分,所以这没有任何意义。

这个问题只发生在 virtualenv 中。这是我所做的:

  • 创建了全新的 Red Hat 5 虚拟机
  • 通过yum -y update 获取最新内容,已重新启动
  • 下载Python-2.7.6.tar.gz,解压,./configure; make; sudo make install
  • 确认 python -V 给我 2.7.6,sudo python -V 也给我 2.7.6
  • wget https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py
  • 修改了 ez_setup.py 以将 --no-check-certificate 标志添加到 wget 以解决我们网络中的代理服务器问题
  • sudo python ez_setup.py
  • sudo easy_install pip
  • sudo pip install virtualenv
  • virtualenv virtpy
  • . virtpy/bin/activate
  • easy_install elementtree

所有这些步骤都成功了,除了最后一个,它失败了:

Traceback (most recent call last):
  File "/home/gperrow/virtpy/bin/easy_install", line 7, in <module>
    from setuptools.command.easy_install import main
  File "/home/gperrow/virtpy/lib/python2.7/site-packages/setuptools/command/easy_install.py", line 44, in <module>
    from setuptools.package_index import PackageIndex
  File "/home/gperrow/virtpy/lib/python2.7/site-packages/setuptools/package_index.py", line 203, in <module>
    sys.version[:3], require('setuptools')[0].version
  File "/usr/local/bin/scripts/pkg_resources.py", line 584, in require
    needed = self.resolve(parse_requirements(requirements))
  File "/usr/local/bin/scripts/pkg_resources.py", line 482, in resolve
    raise DistributionNotFound(req)  # XXX put more info here
pkg_resources.DistributionNotFound: setuptools

我从一个干净的虚拟机开始,我没有做任何不寻常的事情,但我发现除了“easy_install”之外什么都没有。是我做错了什么还是错过了一个或多个步骤?

【问题讨论】:

  • 我刚刚尝试过使用“easy_install elementtree”并没有遇到任何问题。只是出于好奇,为什么不使用“pip install elementtree”?我有一种(可能是错误的)印象,easy_install 通常只用于达到安装“pip”的目的。
  • pip install elementtree 给了我不同的错误。我必须在命令行中添加“--allow-all-external --allow-unverified elementtree”,然后它会下载包但给我“错误:无效命令'egg_info'”
  • 只是为了仔细检查一下,python -V 在激活virualenv之后的输出是什么?也因为 /usr/local/bin/scripts/pkg_resources.py 似乎来自 virtualenv 之外
  • 也是“Python 2.7.6”
  • 半相关,但您应该注意,ElementTree 从 Python 2.5 开始是 stdlib 的一部分,因此您不需要首先安装它。 ;)

标签: python python-2.7 virtualenv pip easy-install


【解决方案1】:

我不知道你究竟为什么会出错,但我相信有一种系统的方法可以让你干净地安装你的自定义 Python,包括一个工作 pip 和 virtualenv。在下文中,我将描述我将使用的过程。

首先,出于多种原因,请保持系统的 Python 不变。其中之一是您的 Linux 发行版的某些部分可能取决于其默认 Python 的细节。你不想破坏这些部分。另一个原因是安装到默认位置的 vanilla Python 可能会被原始 Python 的残差混淆(发行版可能具有与 vanilla 不同的特定 Python/dist-packages/site-packages 目录布局)。这在实践中可能是也可能不是真正的问题——您可以通过不覆盖系统的 Python 从概念上防止这些问题。另一个论点是不需要以 root 身份安装 Python 2.7.6。将其安装为非特权用户(从这里称为“joe”)并将其放入/opt 或其他内容中。这将是一个干净的开始。

设置好您的自定义 Python 后,为自己创建一个小 shell 脚本,例如setup.sh 设置环境以使用您的自定义 Python 版本。确保调整和清理环境。显然,这尤其影响PATH 和PYTHONPATH。我会确保 PYTHONPATH 未设置并且 PATH 正确指向自定义安装。查看env 并尝试确定是否有任何剩余的东西可能以意想不到的方式配置python。毕竟,请确保

$ command -v python
$ python -v

,以 joe 的身份执行,看对了。

仍然是 joe 并在适当的环境下,为自定义 Python 安装 pip。根据http://pip.readthedocs.org/en/latest/installing.html,下载https://raw.github.com/pypa/pip/master/contrib/get-pip.py并执行:python get-pip.py。验证它是否正确安装并且您的环境仍然正确:

$ command -v pip
/CUSTOM/PYTHON/bin/pip

$ pip --version
pip 1.x.x from /CUSTOM/PYTHON/lib/python2.7/site-packages

此时您应该确保您的环境不包含任何VIRTUALENV_* 变量(可能已由您的发行版或任何组件设置(不太可能,但值得检查))。如果设置了任何VIRTUALENV_* 变量,它很可能以意想不到的方式配置virtualenv。摆脱它(取消设置或更改)。然后继续通过pip install virtualenv 使用新的pip 将virtualenv 安装到新的Python 中。通过pip install https://github.com/pypa/virtualenv/tarball/develop 安装最新的virtualenv 开发版本可能也值得一试。

创建并激活一个新的虚拟环境。使用command -v pip,验证pip 来自虚拟环境。然后安装您的自定义包。

注意:如果可能的话,我肯定会使用pip 将东西安装到新的虚拟环境中,而不是easy_install。 pip 很快就会成为官方安装工具(它将包含在 Python 3.4 中)。如果出于某种原因您真的依赖于easy_install,这应该是可能的(easy_install 命令由虚拟环境提供),但为了确保您还应该通过@987654349 验证这一点@。

【讨论】:

  • 我绝对没有改动系统python,并将较新的版本安装到/usr/local(系统python在/usr)。我将尝试以非 root 用户身份将其放入 /opt。
  • 好的,我明白了。我仍然建议尝试我概述的整个过程。当然,不能保证,但我很确定它会起作用。我在很多系统上都这样做过。
  • 在以普通用户身份将 python 安装到 /opt 并按照您的建议调整我的 pip 安装过程之后(根本不使用 easy_install),现在一切正常。感谢您的帮助
  • 很高兴它成功了,感谢您的赏金。您可能还想接受其中一个答案。
【解决方案2】:

我有几个建议,还有我认为是您的问题。让我们先解决问题。

我注意到你在第三个要点中说过

  • 确认 python -V 给我 2.7.6 并且 sudo python -V 也给我 2.7.6

但是当你激活你的 virtualenv 时,你没有显示在倒数第二个要点之后可见的 python 版本。由于该步骤与您的路径有关,因此它可能没有调用您认为的 python。

在你激活你的 virtualenv 之后,python -V 会给你什么?我强烈怀疑在激活步骤之后,您将被重定向并调用系统 python(在 RHEL 上通常为

我的第一个建议是回到你安装 python 的步骤,并指定一个替代安装。比如:

  • ./configure --enable-shared --prefix=/opt/python2.7 && make && sudo make install

(注意:--enable-shared 不是特别需要...只是一个好主意)

我的第二个建议与 python 包管理有关。我们通常会使用 easy_install 来安装 pip。一旦我们有了 pip,我们就切换到使用 pip 来处理所有事情。知道激活 virtualenv 后最后一步会发生什么会很有趣,然后

  • 点安装元素树

还有一个建议。在您安装了 python2.7,然后安装了 virtualenv、pip 和 easy_install 之后,您应该可以使用这些脚本的 *-2.7 版本。尝试调用它们并指定版本可能会更好。这消除了您请求的版本的任何歧义。例如:

  • virtualenv-2.7 virtpy
  • pip-2.7 安装元素树
  • easy_install-2.7 元素树

【讨论】:

    【解决方案3】:

    您的方法是正确的,其他答案(Jan-Philip 和 Piotr 的)也是正确的,但您的问题很简单:

    您在 Python sys.path 上使用 旧安装的一部分 setuptools 以及新安装。很明显,对于当前版本的 setuptools,pkg_resources.py 中的行号应该比 您的回溯 中的行号多大约 100 行:

      ...
      File "/usr/local/bin/scripts/pkg_resources.py", line 669, in require  ## 584 is too old
        needed = self.resolve(parse_requirements(requirements))
      File "/usr/local/bin/scripts/pkg_resources.py", line 572, in resolve  ## 482 is too old
        raise DistributionNotFound(req)
    

    traceback中setuptools前三个文件的行号正确:“virtpy/bin/easy_install”、“virtpy/.../site-packages/setuptools/command/easy_install.py”、“virtpy/. ../site-packages/setuptools/package_index.py”。使用同一个包的不同版本总是一个大问题。

    通过python -c "import sys; print sys.path" 检查您的 Python sys.path 并思考为什么“/home/gperrow/virtpy/lib/python2.7/site-packages”不在“/usr/local/bin/scripts”之前,或者搜索到处都是字符串“/usr/local/bin/scripts”。修理它。一种可能的解决方案是在本地再次将 setuptools 安装到您的活动虚拟环境中:python ez_setup.py。 (检查原因的一种快速方法是首先确定它是否是由用户设置引起的。创建一个新用户帐户,从该帐户运行最后三个命令(virtualenv virtpy; ...),查看结果并删除该用户。如果是有效,请检查您的配置文件中的哪个配置文件导致问题。)

    最后验证是否使用了新的 pkg_resources:

    (virtpy)$ python -c "import pkg_resources; print pkg_resources"
    <module 'pkg_resources' from '/home/you/virtpy/lib/python2.7/site-packages/pkg_resources.pyc'>
    # not the obsoleted /usr/local/bin/scripts/...
    

    【讨论】:

    • 我知道它只是一个来源,使sys.path 列表。我的意思是作为一个例子。这不是答案的本质,但我解决了它。
    【解决方案4】:

    您是否尝试使用软件集合?这是 RHEL 上获取更多更新包(如 python27)的标准方法:

    http://developerblog.redhat.com/2013/08/08/software-collections-quickstart/

    然后要使用 python27,您必须在所有 python 命令前面加上

    scl enable python 
    

    例如与 python27 一起狂欢:

    scl enable python27 bash
    

    此设置可能具有更兼容的环境。

    【讨论】:

      猜你喜欢
      • 2014-12-29
      • 1970-01-01
      • 2016-01-10
      • 2011-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-01
      • 2012-10-23
      相关资源
      最近更新 更多