【问题标题】:Python can't locate distutils_path on Mac OSXPython 在 Mac OSX 上找不到 distutils_path
【发布时间】:2011-03-08 23:24:13
【问题描述】:

我一直在使用 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 更新?另一种可能是我的硬盘快要死了,所以苹果给了我一个新的并运行了迁移助手。也许有些东西没有正确传输?

【问题讨论】:

  • 在查看 distutils/__init__.py 之后,它正在这样做:distutils_path = os.path.join(os.path.dirname(ConfigParser.__file__), 'distutils') 我真的不知道这是如何工作的,但似乎 ConfigParser 指向 OSX 系统 python,它应该是指向我的 virtualenv。
  • 不知道这是否对任何人都有帮助,但是 Homebrew 安装了很好的 python 和 virtualenv 看看这个。 gist.github.com/pithyless/1208841

标签: python macos virtualenv distutils


【解决方案1】:

原来问题在于迁移助手,无论出于何种原因,都没有复制gcc 之类的工具——我重新安装了 Xcode,一切又恢复正常了。

【讨论】:

  • 迁移助手的工作是迁移用户帐户,而不是迁移整个操作系统和相关软件。
  • 所以,只是一个问题,你刚刚重新安装了xcode,它工作正常吗?!无论如何,这对我来说似乎很奇怪,在我将 Mac OS 升级到 Lion 后,我遇到了同样的问题。所以我正在下载一个新版本的xcode,并会尝试安装它,看看。!如果您有任何机会还做了其他事情,请让我知道。欢呼
  • 这行得通:在使用迁移助手设置 Mac 后,我使用了 Kenneth Reitz 的 GCC 安装程序(安装 XCode 的轻量级替代方案),这个问题就消失了。 github.com/kennethreitz/osx-gcc-installer
  • 你需要xcode的命令行工具。在这里找到答案:stackoverflow.com/a/11193009/268125
【解决方案2】:

我在转换到 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 或缺少 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 似乎很有用?

【讨论】:

  • 我疯了吗?只是创建文件对我有用,sudo touch __init__.py
  • 嗯,谢谢!我没有尝试过:我认为 virtualenv 想要阅读 distutils/__init__.py 是有道理的,例如它希望看到定义的某些特定符号。很高兴知道有一个比我更简单的解决方案。
  • 似乎有人应该使用 virtualenv 提交错误报告...?
  • 快速阅读提到的__init__.py 只显示cmets 和元数据,这就是touch [...] 方法有效的原因。如果您偏执,请添加 __version__ 模块属性。
【解决方案3】:
> 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”。

【讨论】:

  • 可能只是“sudo touch /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/distutils/__init__.py”
  • 不要使用这种方法!这可以处理大多数情况,但在某些情况下您会遇到更多麻烦。原文件不为空!它包含 versionrevision 属性,一些脚本依赖于这些属性!按照 Nat 的建议下载原始源代码。
  • @LeZuse 您能否为脚本命名,以便人们决定它是否适合他们。谢谢。
  • 在运行 virtualenv --distribute venv (version 1.8.4) 我得到:AttributeError: 'module' object has no attribute '__version__'
【解决方案4】:

虽然 Migration Assistant 不能很好地处理 XCode 之类的事情,但它还是设计用于传输某些类型的应用程序。它最适用于那些完全存在于/Applications/ 文件夹中的应用程序或那些从/Applications/ 文件夹启动并检查位于其他地方的关联文件(例如/usr/bin/)的应用程序,当它们未被检测到时安装它们启动。

http://support.apple.com/kb/HT4413

【讨论】:

    【解决方案5】:

    我使用了类似的 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/
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-10
      • 1970-01-01
      相关资源
      最近更新 更多