Python无法在Mac OSX上找到distutils_path
我一直在用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 个回答
原来问题出在迁移助手上,不知道为什么,它没有把像 gcc
这样的工具复制过来。我重新安装了一下Xcode,结果一切又正常了。
> 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"的贡献。
我在从 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__.py
或 distutils/__init__.pyc
?