Python在Mac OSX上找不到distutils_path

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 正在尝试在 Mac OSX 系统版本的 Python 中查找 distutils_path,而不是应该在我的虚拟环境版本中查找。
不确定为什么突然出现这种情况。可能是最近进行的OSX更新?另一个可能性是我的硬盘快要坏了,所以苹果给了我一个新的并运行了 Migration Assistant。也许某些东西没有正确地传输过来?

在查看distutils/init.py后,它正在执行以下操作:distutils_path = os.path.join(os.path.dirname(ConfigParser.__file__), 'distutils')我真的不知道这是如何工作的,但似乎ConfigParser指向了OSX系统Python,而应该指向我的虚拟环境。 - Kyle Fox
不知道这是否有助于任何人,但Homebrew有一个很好的Python和Virtualenv安装,请查看此链接。https://gist.github.com/pithyless/1208841 - earlonrails
5个回答

33
我在从OS X 10.5 Leopard升级到OS X 10.7 Lion并使用Migration Assistant时遇到了distutils/__init__.py问题。 我已经安装了Xcode 3.2.6,因此解决了缺少install_name_tool的问题。
Migration Assistant带来了我的先前的虚拟环境,但由于它们是基于Leopard的Python 2.5,我认为我需要使用当前系统的Python 2.7重新创建它们中的每一个。
easy_install已经在PATH中 - 可能是因为它与Lion的Python 2.7捆绑在一起; 这似乎不太可能是Migration Assistant的结果。 我使用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解释器似乎可以运行。
鉴于Lion捆绑的Python 2.7库是无源安装的,改变virtualenv以尝试使用distutils/__init__.pydistutils/__init__.pyc似乎很有用?

17
我疯了吗?只是创建文件对我有用,比如 sudo touch __init__.py - npdoty
哦,谢谢!我没有尝试过那个方法:我以为virtualenv想要读取distutils/init.py有一些特定的目的,例如它想看到定义的某个特定符号。很高兴知道比我的解决方案更简单的方法。 - Nat Goodspeed
似乎有人应该向 virtualenv 提交缺陷报告...? - metamatt
快速阅读所提到的 __init__.py 只显示注释和元数据,这就是为什么 touch [...] 方法有效的原因。如果你很谨慎,可以添加一个 __version__ 模块属性。 - Jacob Oscarson

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"的贡献。


5
请执行以下命令:"sudo touch /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/distutils/init.py"。 - mikelikespie
不要使用这种方法!它可以处理大多数情况,但在某些情况下会遇到更麻烦的问题。原始文件不是空的!它包含__version__和__revision__属性,一些脚本依赖于它们!按照Nat的建议下载原始源代码。 - LeZuse
@LeZuse 请问你能否命名这些脚本,让人们能够决定它是否适合他们。谢谢。 - John Mee
在运行virtualenv --distribute venv(版本1.8.4)时,我遇到了以下错误:AttributeError: 'module' object has no attribute '__version__' - LeZuse

7
原来问题出在迁移助手上,不知何故它没有复制gcc等工具——我重新安装了Xcode,问题得到解决。

迁移助手的工作是迁移用户账户,而不是整个操作系统和相关软件。 - Eric O. Lebigot
所以,只是一个问题,你刚刚重新安装了Xcode,它正常工作了吗?!这对我来说似乎很奇怪,无论如何,我在将Mac OS升级到Lion后遇到了同样的问题。所以我正在下载新版本的Xcode并尝试安装它,看看是否可以解决问题!如果你也偶然做了其他事情,请告诉我。干杯 - Arthur Neves
这个方法可行:在使用迁移助手设置Mac后,我使用了Kenneth Reitz的GCC安装程序(安装XCode的轻量级替代方案),这个问题就解决了。https://github.com/kennethreitz/osx-gcc-installer - Joe Germuska
你需要安装Xcode的命令行工具。在这里找到了答案:https://dev59.com/HGXWa4cB1Zd3GeqPL1MS#11193009 - j7nn7k

1

虽然迁移助理无法很好地处理XCode等内容,但它仍旧被设计用于转移某些类型的应用程序。它最适合存在于/Applications/文件夹中的应用程序或从/Applications/文件夹启动并检查其他位置的相关文件(例如/usr/bin/)的应用程序,在启动时检测到这些文件未安装时进行安装。

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


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/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接