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 подарила мне новую и запустила помощника по миграции. Может быть, что-то не перешло правильно?
Ответы
Ответ 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/