Python无法在Mac OSX上找到distutils_path

时间:2010-06-28 03:07:41

标签: python macos virtualenv distutils

我一直在使用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正在尝试在Mac OSX系统版本Python中找到distutils_path而不是我的virtualenv版本应该如此。

不确定为什么会突然发生这种情况。也许是最近的OSX更新?另一种可能性是我的硬盘驱动器即将死亡,因此Apple给了我一个新硬盘并运行了迁移助手。也许某些东西没有正确转移?

5 个答案:

答案 0 :(得分:33)

在转换到OS X 10.7 Lion(来自OS X 10.5 Leopard)和使用迁移助手时,我遇到了这个distutils/__init__.py问题。我已经安装了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或其缺乏无关。这是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解释器似乎运行。

鉴于与Lion捆绑的Python 2.7库是在没有源代码的情况下安装的,更改virtualenv以尝试Python-2.7.2/Lib/distutils/__init__.pydistutils/__init__.py似乎有用吗?

答案 1 :(得分: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”。

答案 2 :(得分:7)

原来问题是,无论出于何种原因,迁移助手都没有复制像gcc这样的工具 - 我重新安装了Xcode并且事情再次正常工作。

答案 3 :(得分:1)

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

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

答案 4 :(得分: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/