还有许多与此类似的其他StackOverflow问题,但在每种情况下,平台都不同或错误消息不同或解决方案没有效果或过时。我正在尝试设置Python 2.7.6 virtualenv并在其中安装模块,但easy_install给出了错误,指示setuptools不可用。但是AFAIK easy_install是setuptools的一部分,所以这没有任何意义。
问题只发生在virtualenv中。这就是我所做的:
yum -y update
获取最新资料,重新启动./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
--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”除了。我做错了什么,或者我错过了一个或多个步骤?
答案 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版本的环境。确保调整和清理环境。显然,这尤其会影响PATH
和PYTHONPATH
。我会确保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
通过pip
将pip install 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
命令),但是为了确保你也应该验证这是通过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)
我有几点建议,而且我认为是你的问题。我们先来解决这个问题。
我注意到你在第三个要点中说过
但是当你激活你的virtualenv时,你没有显示在第二个到最后一个项目符号点之后可见的python版本。由于该步骤与您的路径一起使用,因此可能无法调用您认为的python。
激活你的virtualenv后,python -V会给你带来什么?我强烈怀疑在激活步骤之后,您被重定向并调用系统python(在RHEL上通常&lt; = 2.5)。对于RHEL而言,重要的是你不要升级系统安装的python版本,RedHat的人们会经历几次箍以确保这一点。
我的第一个建议是返回安装python的步骤,并指定备用安装。类似的东西:
(注意: - 并非特别需要--enable-shared ...只是一个好主意)
我的第二个建议与python包管理有关。我们通常会使用easy_install来安装pip。一旦我们有了pip,我们就会切换到使用pip来处理所有事情。知道在你激活virtualenv之后的最后一步会发生什么会很有趣,然后
还有一个建议。安装完python2.7之后再安装virtualenv,pip&amp; easy_install,你应该有* -2.7版本的这些脚本可用。尝试调用它们可能会更好。指定版本。这消除了您要求的版本的任何歧义。例如:
答案 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
此设置可能具有更兼容的环境。