virtualenv中的Python easy_install给出了setuptools错误

时间:2014-02-12 15:47:43

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

还有许多与此类似的其他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”除了。我做错了什么,或者我错过了一个或多个步骤?

4 个答案:

答案 0 :(得分:3)

我无法确定为什么会出现错误,但我确信有一种系统的方法可以让您干净地安装自定义Python,包括工作点和virtualenv。在下文中,我将描述我将使用的过程。

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

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

$ command -v python
$ python -v

,以乔执行,看起来正确。

仍然是乔,在适当的环境下,为自定义Python安装pip。根据{{​​3}},下载http://pip.readthedocs.org/en/latest/installing.html并执行它: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。摆脱这个(未设置或更改)。然后继续使用新的virtualenv通过pippip install virtualenv安装到新的Python中。也许值得尝试通过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

答案 1 :(得分:1)

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

您在Python setuptools上使用 sys.path 旧安装的一部分以及新安装。很明显,当前版本的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)

回溯中setuptools的前三个文件的行号是正确的:“virtpy / bin / easy_install”,“virtpy /.../ site-packages / setuptools / command / easy_install.py”,“virtpy /。 ../site-packages/setuptools/package_index.py”。使用相同软件包的不同版本每次都是一个大问题。

通过sys.path检查你的Python python -c "import sys; print sys.path"并想一想“/ us / local / bin / scripts “或者到处搜索字符串”/ usr / local / bin / scripts“。修理它。一种可能的解决方案是在本地再次安装setuptools到您的活动virtualenv: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/...

答案 2 :(得分:1)

我有几点建议,而且我认为是你的问题。我们先来解决这个问题。

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

  • 确认python -V给了我2.7.6和sudo python -V也给了我2.7.6

但是当你激活你的virtualenv时,你没有显示在第二个到最后一个项目符号点之后可见的python版本。由于该步骤与您的路径一起使用,因此可能无法调用您认为的python。

激活你的virtualenv后,python -V会给你带来什么?我强烈怀疑在激活步骤之后,您被重定向并调用系统python(在RHEL上通常&lt; = 2.5)。对于RHEL而言,重要的是你不要升级系统安装的python版本,RedHat的人们会经历几次箍以确保这一点。

我的第一个建议是返回安装python的步骤,并指定备用安装。类似的东西:

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

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

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

  • pip install elementtree

还有一个建议。安装完python2.7之后再安装virtualenv,pip&amp; easy_install,你应该有* -2.7版本的这些脚本可用。尝试调用它们可能会更好。指定版本。这消除了您要求的版本的任何歧义。例如:

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

答案 3 :(得分:0)

您是否尝试使用软件集合?这是RHEL的标准方法,可以获得更新的软件包,如python27:

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

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

scl enable python 

e.g。用python27进行bash:

scl enable python27 bash

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