为什么安装python包会破坏setuptools并导致找不到pkg_resources?

这部分是一个问题,部分是我自己在遇到此错误时发现的问题:

(cdbak)USER-MBP-2:.virtualenvs <YOUR_USER_NAME>$pip 
Traceback (most recent call last):
    File "/Users/<YOUR_USER_NAME>/.virtualenvs/cdbak/bin/pip", line 6, in <module>
    from pkg_resources import load_entry_point
ImportError: No module named pkg_resources

当我尝试在我的虚拟环境中通过pip安装pypsum以与django一起使用时,出现了这个问题.

(cdbak)USER-MBP-2:.virtualenvs <YOUR_USER_NAME>$pip install pypsum

我一直在虚拟环境中工作,所以我很幸运,在它崩溃后,我可以用我编写的脚本重置我的虚拟环境.

我复制了安装过程中的输出并开始仔细研究它,看起来setuptools中出现了问题.

安装过程尝试构建软件包,但是在setuptools中找不到build_py,导致它通过重命名当前安装的setuptools来“修补”setuptools安装.

这是我认为时髦的东西开始发生的部分:

Setuptools installation detected at /Users/<YOUR_USER_NAME>/.virtualenvs/cdbak/lib/python2.7/site-packages/setuptools-0.6c11-py2.7.egg
Egg installation
Patching...
Renaming /Users/<YOUR_USER_NAME>/.virtualenvs/cdbak/lib/python2.7/site-packages/setuptools-0.6c11-py2.7.egg into /Users/<YOUR_USER_NAME>/.virtualenvs/cdbak/lib/python2.7/site-packages/setuptools-0.6c11-py2.7.egg.OLD.1321360113.04

然后它继续尝试安装另一个版本的setuptools或似乎:

After install bootstrap.
Creating /Users/<YOUR_USER_NAME>/.virtualenvs/cdbak/lib/python2.7/site-packages/setuptools-0.6c11-py2.7.egg-info
Creating /Users/<YOUR_USER_NAME>/.virtualenvs/cdbak/lib/python2.7/site-packages/setuptools.pth

但它似乎没有在其当前位置正确安装setuptools包,然后导致缺少pkg_resources模块(事实上,它也缺少很多其他东西)

[建立]

OS: Mac OS X Lion
Python 2.7.1 (r271:86832, Jun 16 2011, 16:59:05)
virtualenv v1.6.1

使用virtualenvwrapper使用需求文件安装这些软件包的全新虚拟环境:

mercurial==1.9.3
Django>=1.3.1
MySQL-python>=1.2.3
Sphinx
wsgiref
pylint
yolk
dbgp
django-debug-toolbar
south

我能够使用pip来安装其他软件包,但由于某种原因它似乎打破了这个安装.

[题]
  – 人们认为这个包的安装过程是个错误吗?
  – 或者,setuptools是一个错误?
  – 或者,我只是错误地安装它?

[额外注意事项]
我可以附加整个输出的文件,但它是一个长文件,我决定只提取我觉得相关的段.如果您想查看完整文件,我也可以上传.

解决方法:

我不确定你的所有问题但是至少有一个问题是由loremipsum包引起的,它是pypsum包的依赖.出于某种原因,在loremipsum的setup.py文件中,作者包含了分发包的特定要求:

egg = {
    'name': name,
    'version': module.__version__,
    'author': author,
    'author_email': email.strip('<>'),
    'url': url,
    'description': "A Lorem Ipsum text generator",
    'long_description': long_description,
    'classifiers': module.__classifiers__,
    'keywords': ['lorem', 'ipsum', 'text', 'generator'],
    'setup_requires': ['distribute'],
    'install_requires': ['distribute'],
    'packages': [name],
    # 'package_dir': {'': '.'},
    # 'package_data': {'': 'default/*.txt'},
    # 'data_files': [(name, ('default/dictionary.txt', 'default/sample.txt'))],
    'include_package_data': True,
    'test_suite': 'tests.suite' }

正如您所知,分发是setuptools包的一个分支;这背后有着悠久的历史.由于distribute应该是setuptools几乎与插件兼容的替代品,因此它会尝试伪装成setuptools并禁用已安装在该Python实例中的任何现有setuptools.因此,将distribute作为一个要求放在setup.py文件中通常不是一个好主意.默认情况下,virtualenv将安装setuptools的一个版本,但它确实有一个选项来使用distribute. Apple提供的系统Pythons OS X 10.6和10.7已预装了安装工具的版本,因为它们位于非标准系统目录中,所以不能轻易修补.在OS X上使用virtualenv时的简单解决方法似乎也是使用其no-site-packages选项,这将阻止系统Python中的setuptools版本干扰virtualenv中所需的分发.毫无疑问,分布式和安装工具之间的混淆导致了pkg_resources出现的问题,因为它们也是由两者提供的.

所以尝试用这种方式重新创建你的virtualenv:

virtualenv --distribute --no-site-packages /path/to/ve

这也会产生副作用,即不包括Apple随系统Python提供的第三方软件包.如果你真的需要它们,你可以用PYTHONPATH添加它们,但最好安装不同的版本.

上一篇:python – 如何指定setuptools创建的命令脚本的shebang行


下一篇:python – 完整更新pip包时出错