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

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


person Kyle Fox    schedule 28.06.2010    source источник
comment
Посмотрев на distutils / __ init__.py, он делает следующее: distutils_path = os.path.join(os.path.dirname(ConfigParser.__file__), 'distutils') Я действительно понятия не имею, как это работает, но похоже, что ConfigParser указывает на системный python OSX, тогда как он должен указывать на мой virtualenv.   -  person Kyle Fox    schedule 28.06.2010
comment
Не знаю, поможет ли это кому-нибудь, но у Homebrew есть хорошая установка python, и virtualenv проверьте это. gist.github.com/pithyless/1208841   -  person earlonrails    schedule 10.08.2013


Ответы (5)


Я столкнулся с этой 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'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 Python-2.7.2/Lib/distutils/__init__.py

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

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

person Nat Goodspeed    schedule 05.12.2011
comment
Я сумасшедший? Просто создание файла у меня сработало, а-ля sudo touch __init__.py - person npdoty; 09.03.2012
comment
Хм, спасибо! Я не пробовал этого: я предположил, что есть какой-то смысл в том, что virtualenv хочет прочитать distutils / __ init__.py, например какой-то конкретный символ, который он хотел видеть определенным. Рад узнать, что есть еще более простое решение, чем мое. - person Nat Goodspeed; 03.04.2012
comment
похоже, кто-то должен отправить отчет об ошибке с помощью virtualenv ...? - person metamatt; 20.07.2012
comment
При быстром чтении упомянутого __init__.py отображаются только комментарии и метаданные, поэтому метод touch [...] работает. Добавьте атрибут модуля __version__, если вы параноик. - person Jacob Oscarson; 06.08.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 Гудспид».

person John Mee    schedule 15.04.2012
comment
может быть просто sudo touch /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/distutils/__init__.py - person mikelikespie; 15.06.2012
comment
НЕ используйте этот метод! Это может помочь в большинстве случаев, но есть ситуации, когда у вас возникнут больше проблем. Исходный файл не пустой! Он содержит атрибуты version и revision, и некоторые сценарии зависят от них! Загрузите оригинальный исходный код, как предложено Натом. - person LeZuse; 30.11.2012
comment
@LeZuse Не могли бы вы назвать сценарии, чтобы люди могли решить, будет ли это работать для них или нет. Спасибо. - person John Mee; 02.12.2012
comment
При запуске virtualenv --distribute venv (версия 1.8.4) я получил: AttributeError: 'module' object has no attribute '__version__' - person LeZuse; 03.12.2012

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

person Kyle Fox    schedule 28.06.2010
comment
Задача Помощника по миграции - переносить учетные записи пользователей, а не всю ОС и связанное программное обеспечение. - person Eric O Lebigot; 28.06.2010
comment
Итак, просто вопрос, вы только что снова установили xcode, и он отлично работает ?! В любом случае это кажется мне странным, у меня такая же проблема после обновления Mac OS до Lion. поэтому я загружаю новую версию xcode и попытаюсь установить ее, чтобы увидеть. Если случайно вы сделали что-то еще, пожалуйста, дайте мне знать. ваше здоровье - person Arthur Neves; 24.07.2011
comment
Это работает: после использования Migration Assistant для настройки Mac я использовал установщик GCC Кеннета Рейца (легкая альтернатива установке XCode), и эта проблема исчезла. github.com/kennethreitz/osx-gcc-installer - person Joe Germuska; 04.06.2012
comment
Вам нужны утилиты командной строки xcode. Нашел ответ здесь: stackoverflow.com/a/11193009/268125 - person j7nn7k; 06.08.2012

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

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

person Wes    schedule 07.08.2012

Я использовал аналогичный подход Нэта Гудспида.

Но я скопировал все файлы * .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/
person lucmult    schedule 21.02.2013