21

我一直在使用 virtualenv + pip 进行 python 开发。我不确定发生了什么,但突然每当我尝试运行命令行工具或导入库时,我都会收到以下错误消息:

Traceback (most recent call last):
  File "/Users/kyle/.virtualenvs/fj/bin/pip", line 4, in <module>
    import pkg_resources
  File "/Users/kyle/.virtualenvs/fj/lib/python2.6/site-packages/setuptools-0.6c11-py2.6.egg/pkg_resources.py", line 698, in <module>
    the platform/python version defined at initialization are added.
  File "/Users/kyle/.virtualenvs/fj/lib/python2.6/site-packages/setuptools-0.6c11-py2.6.egg/pkg_resources.py", line 701, in Environment
    search_path = sys.path
  File "/Users/kyle/.virtualenvs/fj/lib/python2.6/site-packages/setuptools-0.6c11-py2.6.egg/pkg_resources.py", line 96, in get_supported_platform
    'Environment', 'WorkingSet', 'ResourceManager',
  File "/Users/kyle/.virtualenvs/fj/lib/python2.6/site-packages/setuptools-0.6c11-py2.6.egg/pkg_resources.py", line 221, in get_build_platform
    if provDarwin:
  File "/Users/kyle/.virtualenvs/fj/lib/python2.6/distutils/__init__.py", line 14, in <module>
    exec open(os.path.join(distutils_path, '__init__.py')).read()
IOError: [Errno 2] No such file or directory: '/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/distutils/__init__.py'

据我所知,Python 试图distutils_path在 Mac OSX 系统版本 Python 中找到,而不是我应该的 virtualenv 版本。

不知道为什么这突然开始发生。也许最近的 OSX 更新?另一种可能是我的硬盘快要死了,所以苹果给了我一个新的并运行了迁移助手。也许有些东西没有正确传输?

4

5 回答 5

33

distutils/__init__.py我在转换到 OS X 10.7 Lion(从 OS X 10.5 Leopard)并使用迁移助手时遇到了这个问题。我已经安装了 Xcode 3.2.6——从而解决了 install_name_tool 缺失的问题。

迁移助手带来了我以前的 virtualenvs,但由于它们基于 Leopard 的 Python 2.5,我认为我需要使用当前系统 Python 2.7 重新创建它们中的每一个。

easy_install 已经在 PATH 中——可能是因为它与 Lion 的 Python 2.7 捆绑在一起;这似乎不太可能是迁移助手的结果。我使用easy_install 来安装virtualenv。

在我看来,这个问题与 Xcode 或缺乏 Xcode 没有任何关系。这是由 virtualenv 命令放置在新虚拟环境中的文件中的特殊行:


  File "/path/to/my/virtualenv/lib/python2.7/distutils/__init__.py", line 16, in 
    exec(open(os.path.join(distutils_path, '__init__.py')).read())
IOError: [Errno 2] No such file or directory: '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/distutils/__init__.py'

问题是,在与 Lion 捆绑的 Python 2.7 安装中,该库不附带 .py 源文件。该目录包含 .pyc 和 .pyo 文件,但没有 .py 文件。virtualenv 似乎并不期望这一点。

我的解决方法是下载 Python 2.7 源代码:http:
//python.org/ftp/python/2.7.2/Python-2.7.2.tar.bz2

并解压distutils/__init__.py到预期的地方:
sudo tar xvjf ~/Downloads/Python-2.7.2.tar.bz2 --strip-components=2 -C /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7 Python-2.7.2/Lib/distutils/__init__.py

这允许 virtualenv 成功完成,并且生成的 Python 解释器似乎可以运行。

distutils/__init__.py鉴于与 Lion 捆绑在一起的 Python 2.7 库是在没有源代码的情况下安装的,将 virtualenv 更改为尝试使用or似乎很有用distutils/__init__.pyc

于 2011-12-05T23:29:34.657 回答
22
> cd /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/distutils/
> sudo touch __init__.py

Lion 上的开箱即用 python 没有 python 源 - 只有编译的 pyc/pyo 文件。然而 virtualenv 去寻找 distutils 源文件只是为了确认它在哪里。事实证明,我们需要做的就是触摸它正在寻找的文件。

学分属于“npdoty”和“Nat Goodspeed”。

于 2012-04-15T23:19:18.813 回答
7

事实证明,问题在于迁移助手,无论出于何种原因,都没有复制诸如gcc我重新安装 Xcode 之类的工具,并且事情再次正常工作。

于 2010-06-28T03:49:07.287 回答
1

虽然 Migration Assistant 不能很好地处理 XCode 之类的事情,但它仍然旨在传输某些类型的应用程序。它最适用于完全存在于/Applications/文件夹中的应用程序或从/Applications/文件夹启动并检查位于其他位置的关联文件(例如,/usr/bin/),在启动时未检测到它们时安装它们。

请参阅http://support.apple.com/kb/HT4413

于 2012-08-07T20:21:51.110 回答
0

我使用了类似的 Nat Goodspeed 方法。

但我已经复制了所有 *.py 文件。

下载相同版本的系统 python,在我的例子中是 2.7.2:

$ python --version

下载并解压。 http://python.org/ftp/python/2.7.2/Python-2.7.2.tar.bz2

# -n copy only missing files, -r recursively
$ sudo cp -rn ~/Downloads/Python-2.7.2/Lib/* /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/
于 2013-02-21T23:58:56.230 回答