Python在虚拟环境中使用easy_install时出现setuptools错误

11

有许多其他类似于这个问题的StackOverflow问答,但在每种情况下,平台不同或错误消息不同或解决方案没有效果或已过时。我正在尝试设置Python 2.7.6虚拟环境并在其中安装模块,但是easy_install提示不存在setuptools,但据我所知,easy_install是setuptools的一部分,这毫无意义。

问题只发生在虚拟环境中。以下是我的步骤:

  • 创建了一个全新的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标志,以解决我们网络中代理服务器的问题
  • 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' 的状态。 - MrWonderful
"pip install elementtree" 给我不同的错误。我必须在命令行中添加 "--allow-all-external --allow-unverified elementtree",然后它会下载包但是给我 "error: invalid command 'egg_info'" 的错误。 - Graeme Perrow
1
请再确认一下,在激活虚拟环境后,python -V 的输出是什么?另外,因为/usr/local/bin/scripts/pkg_resources.py似乎来自虚拟环境之外。 - Stefano Sanfilippo
这也是“Python 2.7.6”。 - Graeme Perrow
2
半相关的是,你应该注意到 ElementTree 自 Python 2.5 起已经成为标准库的一部分了,因此你一开始就不需要安装它。 ;) - Max Noel
我按照你的步骤进行操作,但在执行sudo python ez_setup.py时卡住了,出现了SyntaxError: invalid syntax。这是因为a) setuptools已经停止支持Python 2.4和Python 2.5,b) ez_setup.py使用sys.executable来运行Python,而由于使用了sudo,它的路径是/usr/bin/python,这是一个全新安装的Python 2.4.3版本(可能是其他2.4.x版本,在我没有进行更新的情况下)。你运行的ez_setup.py版本是什么?sudo的版本是多少?你有没有省略某些步骤? - Piotr Dobrogost
4个回答

3
我无法确定你为什么会出现错误,但我相信有一种系统方法可以让您干净地安装自定义 Python,包括一个工作的 pip 和 virtualenv。接下来,我将描述我将使用的过程。
首先,不要触及系统的 Python,原因有很多。其中之一是您的 Linux 发行版的某些部分可能依赖于其默认 Python 的特定内容。您不希望破坏这些部分。另一个原因是默认位置安装的原始 Python 可能会被原始 Python 的残留物所困扰(发行版可能具有与原始 Python 不同的特定 Python/dist-packages/site-packages 目录布局)。在实践中,这可能是或可能不是一个真正的问题 - 您可以通过“不”覆盖系统的 Python 在概念上防止这些问题。另一个论点是没有必要以 root 身份安装 Python 2.7.6。将其作为非特权用户(从这里称为“joe”)安装并将其放入 /opt 或其他位置。这将是一个干净的开始。

在设置自定义Python之后,创建一个小的shell脚本,例如setup.sh,以设置使用自定义Python版本的环境。确保调整和清理环境。显然,这尤其影响PATHPYTHONPATH。我会确保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在新的Python中安装virtualenv。也可以尝试通过pip install https://github.com/pypa/virtualenv/tarball/develop安装最新的开发版本的virtualenv

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

注意:如果可能的话,我一定会使用pip来安装新虚拟环境中的东西,而不是easy_installpip很快将成为官方安装程序(它将与Python 3.4一起包含)。如果出于某种原因您确实依赖于easy_install,则应该是可行的(easy_install命令由虚拟环境提供),但为了确保,您还应通过command -v easy_install进行验证。

我绝对没有动系统的Python,而是将新版本安装在/usr/local目录下(系统的Python在/usr目录下)。我会尝试以非root用户身份将其放在/opt目录下。 - Graeme Perrow
好的,我明白了。我仍然建议尝试我概述的整个过程。当然,没有保证,但我相信它会起作用。我在许多系统上都这样做过。 - Dr. Jan-Philip Gehrcke
在将Python安装到/opt目录下并按照您的建议调整了pip安装过程(完全不使用easy_install)后,现在一切都正常工作了。感谢您的帮助。 - Graeme Perrow
很高兴它起作用了,感谢您的慷慨奖励。您可能还想接受其中一个答案。 - Dr. Jan-Philip Gehrcke

1
你的方法是正确的,其他答案(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列表,我的意思是将其作为一个例子。这并不是答案的实质,但我会修复它。 - hynekcer

1
我有几个建议,以及我认为是你的问题。我们先来看问题。
我注意到你在第三个要点中说:
确认 python -V 给出的是 2.7.6,sudo python -V 也给出了 2.7.6
但是,在倒数第二个要点之后,你没有显示可见的 python 版本,当你激活虚拟环境时。由于该步骤涉及到路径,可能没有调用你想要的 python。
激活虚拟环境后,python -V 给出了什么?我强烈怀疑在激活步骤之后,你被重定向并调用系统 python(在 RHEL 上通常是 <= 2.5)。对于 RHEL 来说,不升级系统安装的 python 版本很重要,RedHat 公司的人们会通过几个步骤来确保这一点。
我的第一个建议是回到安装 python 的步骤,并指定另一个安装目录。例如:
./configure --enable-shared --prefix=/opt/python2.7 && make && sudo make install
(注意: --enable-shared 不是必需的...只是一个好主意)
我有两个建议与Python包管理相关。我们通常使用easy_install来安装pip。一旦我们拥有了pip,我们就开始使用pip进行所有操作。在您激活虚拟环境后,执行以下步骤会很有趣:

  • pip install elementtree
另一个建议是,在安装了Python2.7并安装了virtualenv、pip和easy_install之后,您应该有*-2.7版本的这些脚本可用。最好尝试调用它们并指定版本。这样可以消除您请求的版本的任何歧义。例如:

  • virtualenv-2.7 virtpy
  • pip-2.7 install elementtree
  • easy_install-2.7 elementtree

0

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

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

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

scl enable python 

例如使用Python27进行交互式命令行:

scl enable python27 bash

这个设置可能会拥有更兼容的环境。


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