Python не может найти distutils_path на Mac OSX - PullRequest
21 голосов
/ 28 июня 2010

Я использую 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 дала мне новый и запустила Migration Assistant. Может быть, что-то не правильно передано?

Ответы [ 5 ]

33 голосов
/ 06 декабря 2011

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

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

easy_install уже был в PATH - вероятно, потому что он был в комплекте с Lion's Python 2.7;кажется маловероятным, что это будет результатом Migration Assistant.Я использовал 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 <code>Python-2.7.2/Lib/distutils/__init__.py

Это позволяет virtualenv успешно завершаться, и итоговый интерпретатор Python, похоже, запускается.

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

22 голосов
/ 16 апреля 2012
> cd /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/distutils/
> sudo touch __init__.py

Встроенный Python на Lion поставляется без исходного кода Python - только скомпилированные файлы pyc / pyo.Однако virtualenv ищет исходный файл distutils, чтобы подтвердить, где он находится.Оказывается, все, что нам нужно сделать, это коснуться файла, который он ищет.

Кредиты принадлежат "npdoty" и "Nat Goodspeed".

7 голосов
/ 28 июня 2010

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

1 голос
/ 08 августа 2012

Хотя Migration Assistant не очень хорошо обрабатывает такие вещи, как XCode, тем не менее он предназначен для передачи некоторых типов приложений.Он лучше всего работает с теми, которые полностью существуют в папке /Applications/, или с теми приложениями, которые запускаются из папки /Applications/ и проверяют связанные файлы, расположенные в другом месте (например, /usr/bin/), устанавливая их, когда они не обнаруживаютсязапуск.

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

0 голосов
/ 22 февраля 2013

Я использовал аналогичный подход 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/
...