我一直在使用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给了我一个新硬盘并运行了迁移助手。也许某些东西没有正确转移?
答案 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__.py
或distutils/__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/
),安装时它们在启动时未被检测到。
答案 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/