为什么安装Python包会导致setuptools损坏且找不到pkg_resources?

5 投票
1 回答
1511 浏览
提问于 2025-04-17 06:37

这部分内容既是一个问题,也包含了我自己在遇到这个错误时发现的一些情况:

(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模块(实际上,它还缺少很多其他东西)

[设置]

操作系统:Mac OS X Lion
Python 2.7.1 (r271:86832, 2011年6月16日, 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的问题?
- 或者,是我安装得不对?



[额外说明]
我可以附上整个输出的文件,但文件很长,我决定只提取我认为相关的部分。如果你想查看完整的文件,我也可以上传。

1 个回答

3

我不确定你遇到的所有问题,但至少有一个问题是由 loremipsum 这个包引起的,它是 pypsum 包的一个依赖。奇怪的是,在 loremipsumsetup.py 文件中,作者特别要求使用 distribute 这个包:

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' }

你可能知道,distributesetuptools 包的一个分支,背后有一段复杂的历史。因为 distribute 设计上是要几乎完全替代 setuptools,所以它会试图伪装成 setuptools,并禁用在那个 Python 实例中已经安装的 setuptools。因此,在 setup.py 文件中把 distribute 作为依赖通常不是个好主意。默认情况下,virtualenv 会安装一个版本的 setuptools,但它也有选项可以使用 distribute。在 OS X 10.6 和 10.7 中,苹果自带的系统 Python 已经预装了 setuptools 的版本,而且因为它们在非标准的系统目录中,所以不容易进行修改。当在 OS X 上使用 virtualenv 时,一个简单的解决办法是使用它的 no-site-packages 选项,这样可以防止系统 Python 中的 setuptools 版本干扰 virtualenv 中需要的 distribute。毫无疑问,distributesetuptools 之间的混淆导致了与 pkg_resources 相关的问题,因为这两个包都提供了它。

所以试着这样重新创建你的 virtualenv

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

这样做的副作用是不会包含苹果随系统 Python 一起提供的第三方包。如果你真的需要这些包,可以通过 PYTHONPATH 把它们加回来,但最好还是安装单独的版本。

撰写回答