Подтвердить что ты не робот

Python не может найти distutils_path на Mac OSX

Я использую 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 пытается найти distutils_path в системной версии Mac OSX Python, а не в моей версии virtualenv, как это должно быть.

Не знаю, почему это внезапно началось. Может быть, недавнее обновление OSX? Другая возможность заключается в том, что мой жесткий диск вот-вот умрет, поэтому Apple подарила мне новую и запустила помощника по миграции. Может быть, что-то не перешло правильно?

4b9b3361

Ответ 1

Я столкнулся с этой проблемой distutils/__init__.py при переходе на OS X 10.7 Lion (из OS X 10.5 Leopard) и с помощью ассистента миграции. Я уже установил Xcode 3.2.6 - таким образом, устраняя отсутствующую проблему install_name_tool.

Помощник по миграции перенес мои предыдущие виртуальные имена, но поскольку они были основаны на Leopard Python 2.5, я полагаю, что мне нужно воссоздать каждую из них с текущей системой Python 2.7.

easy_install уже был в PATH - возможно, потому, что он был связан с Lion Python 2.7; это вряд ли будет результатом ассистента по миграции. Я использовал easy_install для установки virtualenv.

Эта проблема, мне кажется, не имеет ничего общего с Xcode или ее отсутствием. Это своеобразная строка в файле, размещенном в новом виртуальном env командой 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'

Проблема в том, что в установке Python 2.7, входящей в комплект поставки Lion, в библиотеку не входят .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.

Учитывая, что библиотека Python 2.7 в комплекте с Lion установлена ​​без источника, может показаться полезным изменить virtualenv, чтобы попробовать либо distutils/__init__.py, либо distutils/__init__.pyc?

Ответ 2

> 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".

Ответ 3

Оказывается, проблема заключалась в том, что помощник по миграции по какой-либо причине не копировал такие инструменты, как gcc - я переустановил Xcode и все снова работало правильно.

Ответ 4

В то время как помощник по миграции не так хорошо обрабатывает такие вещи, как 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/