Python无法在Mac OSX上找到distutils_path

21 投票
5 回答
10912 浏览
提问于 2025-04-16 00:30

我一直在用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更新导致的?还有一种可能是我的硬盘快坏了,所以苹果给我换了个新的,并且用了迁移助手。也许有些东西没有正确转移过来?

5 个回答

7

原来问题出在迁移助手上,不知道为什么,它没有把像 gcc 这样的工具复制过来。我重新安装了一下Xcode,结果一切又正常了。

22
> cd /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/distutils/
> sudo touch __init__.py

在Lion系统上,默认安装的Python没有源代码,只有编译后的pyc/pyo文件。不过,virtualenv会去找一个叫distutils的源文件,主要是为了确认它的位置。其实,我们只需要创建一个它需要的文件,就能解决这个问题。

感谢"npdoty"和"Nat Goodspeed"的贡献。

33

我在从 OS X 10.5 Leopard 升级到 OS X 10.7 Lion 的过程中,遇到了一个关于 distutils/__init__.py 的问题,这个过程是通过迁移助手完成的。我已经安装了 Xcode 3.2.6,这样就解决了缺少 install_name_tool 的问题。

迁移助手把我之前的虚拟环境带了过来,但因为它们是基于 Leopard 的 Python 2.5 的,所以我想我需要用当前系统的 Python 2.7 重新创建每一个虚拟环境。

easy_install 已经在我的路径中,这可能是因为它是和 Lion 的 Python 2.7 一起打包的,似乎不是迁移助手的结果。我用 easy_install 安装了 virtualenv。

我觉得这个问题和 Xcode 没什么关系。问题出在虚拟环境命令创建的一个文件里,有一行很奇怪:


  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,让它尝试寻找 distutils/__init__.pydistutils/__init__.pyc

撰写回答