Могут ли релизы python.org играть со сборками фреймворка Apple? - PullRequest
4 голосов
/ 20 августа 2011

(Дополнительные извинения за отсутствие или правильные ссылки; система не позволит мне добавить более двух.)

К сожалению, я выучил трудный способ, которым выне следует связываться с установками Python по умолчанию в Mac OS X (в частности, 10.6.8).

После использования установщиков python.org для 2.6.6 (http://www.python.org/getit/releases/2.6.6/) и 2.5.4 (http://www.python.org/getit/releases/2.5.4/),) у меня есть версии Python, которые являются более зрелыми, чем предоставленные Apple (которыеотлично подходит для разработки), но имеет нарушенную функциональность ядра системы (что плохо почти для всего остального). Наиболее заметные перерывы до сих пор были при попытке запустить namebench (https://code.google.com/p/namebench/), Blink (* 1014)* и Mercurial (https://www.mercurial -scm.org / ). Из того, что я могу собрать, речь идет о путях.

При установке по умолчанию пути должны напоминать то, что было указанов этот вопрос . Вместо этого мой выглядит так:

$ /usr/bin/python2.6 -V
Python 2.6.6

$ which python
/usr/bin/python
$ python
Python 2.6.6 (r266:84374, Aug 31 2010, 11:00:51) 
[GCC 4.0.1 (Apple Inc. build 5493)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> for i in sys.path:
...     print i
... 
/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/setuptools-0.6c11-py2.6.egg
/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/pip-1.0.2-py2.6.egg
/Library/Frameworks/Python.framework/Versions/2.6/lib/python26.zip
/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6
/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/plat-darwin
/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/plat-mac
/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/plat-mac/lib-scriptpackages
/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/lib-tk
/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/lib-old
/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/lib-dynload
/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages

(Это похожая история для 2.5, но, для простоты, я буду придерживаться 2.6.)

Проблема, по-видимому, заключается в том, что не включено:

  • / Library / Python / 2.6 / site-packages / *. Egg
  • / Library / Python / 2.6 / site-packages
  • / Система / Библиотека / Каркасы / Python.framework / Версии / 2.6 / lib / python2.6
  • / Система / Library / Frameworks / Python.framework / Versions / 2.6 / Extras / lib / python

Это объясняет, почему Blink и namebench не могут найти PyObjC ( PyObjC предустановлен на OSX SL?) и Mercurial не может найти свои модули (в /Library/Python/2.6)

Проблема # 4865 в трекере ошибок Python частично решает эту конкретную проблему, которая с тех порбыло исправлено для версий 2.7 и выше.Но поскольку это «запрос функции, а не исправление ошибки», он не был перенесен на 2.5 и 2.6.Даже тогда, глядя на зафиксированное исправление (http://hg.python.org/lookup/r70778), Я не уверен, что оно решает проблему отсутствия ссылок на каталоги "Extras".

Я понимаю, что могу вручную добавить пути к Python с помощьювручную изменив site.py. Я также мог бы использовать переменную окружения PYTHONPATH. Я бы предпочел не наносить дополнительного ущерба изменением site.py, а изменения PYTHONPATH действительны только для скриптов / приложений, запускаемых из оболочки с использованием моего пользователя.account.

Могу ли я заставить эти более поздние версии Python ссылаться на те же пути, что и установки фреймворка по умолчанию? Если да, то как лучше всего это сделать? Если нет, то существует ли приемлемый методоткат к настройкам системы по умолчанию?

1 Ответ

3 голосов
/ 20 августа 2011

Вы неправильно понимаете, как установки Python работают на OS X. Каждый экземпляр Python имеет свой собственный каталог site-packages.Стандартное расположение установщиков фреймворка находится в рамках ./lib/pythonx.y/site-packages.Так что для установщиков python.org, которые устанавливаются в /Library/Frameworks/Python.framework, вы найдете его 2.6 site-packages здесь:

/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/

Apple делает некоторые модификации версий Python, которые поставляются с выпусками OS X.Начиная с OS X 10.5, системные Pythons устанавливаются по адресу:

/System/Library/Frameworks/Python.framework

, и Apple решает включить некоторые дополнительные сторонние пакеты в нестандартный каталог ./Extras в каждомверсия.Он также использует нестандартное расположение для каталога site-packages каждой версии.Они создаются в /Library/Python/, предположительно, чтобы установленные пользователем пакеты ничего не изменяли в /System/Library.Таким образом, для поставляемого Apple Python 2.6 его каталог site-packages:

/Library/Python/2.6/site-packages

и может рассматриваться как расширенный пакетами в ./Extras.

Каждый PythonЭкземпляр имеет отдельный каталог site-packages.Он не предназначен и часто не позволяет совместно использовать пакеты в site-packages различных экземпляров даже одной и той же вспомогательной версии Python, то есть 2.6.Наиболее очевидная проблема заключается в том, что часто существуют различия в версии компилятора C, ABI OS X (MACOSX_DEPLOYMENT_TARGET), версии SDK и / или архитектурах ЦП, используемых для создания интерпретаторов Python и впоследствии используемых Distutils длямодули расширения build C., включенные в сторонние пакеты.

В Mac OS X 10.6 поставляемый Apple Python построен с использованием gcc-4.2 и предназначен только для OSX 10.6 и включает 3 архитектуры ЦП (i386,x86_64 и ppc).Установщики python.org для Python 2.6 также созданы для работы на более старых системах, поэтому они имеют цель 10.3 и более поздние, используют gcc-4.0 и являются 32-разрядными (i386 и ppc).Таким образом, в общем случае вы не можете запускать модули расширения C, созданные для одного Python вместе с другим.

Это означает, что, как правило, вам нужно устанавливать отдельные копии сторонних пакетов, которые вам нужны, для каждого и для каждого из них.Python, если они еще не включены в этот Python.Это включает в себя основные предметы, такие как easy_install (из setuptools или Distribute).Система Pythons в 10.5+ включает в себя easy_install версию в /usr/bin для них.Если вы устанавливаете python.org Python, вам нужно установить для него отдельную версию;по умолчанию команда easy_install будет установлена ​​в каталог ./bin этого Python в ее структуре;это расположение по умолчанию Distutils.Вот почему рекомендуется добавить этот каталог в PATH оболочки (а установщик python.org для Python 2 по умолчанию делает это автоматически).

Изменение, внесенное Issue4865, на самом деле не является хорошим решением и можетошибка с модулями расширения C.Я не буду зависеть от того, останется ли он в Python в будущих версиях.

Кроме того, установка Python в Python.org ни в коей мере не нарушает работу системного Python, поскольку они являются полностью независимыми установками, использующими различные расположения файловой системы.Единственное, что может измениться, это то, какой экземпляр Python вызывается при вводе определенного имени. То, что определяется главным образом порядком поиска переменной среды PATH оболочки.Как уже отмечалось, установщик python.org по умолчанию изменяет этот порядок, но системный Python по-прежнему доступен, используя его абсолютный путь /usr/bin/python2.6.Или вы можете отменить изменения в профиле оболочки, например, .bash_profile.

$ echo $PATH
/Library/Frameworks/Python.framework/Versions/2.6/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin
$ which python python2.6
/Library/Frameworks/Python.framework/Versions/2.6/bin/python
/Library/Frameworks/Python.framework/Versions/2.6/bin/python2.6
$ python -V
Python 2.6.6
$ python2.6 -V
Python 2.6.6
$ /usr/bin/python -V
Python 2.6.1
$ /usr/bin/python2.6 -V
Python 2.6.1
#
# remove python.org Python 2.6 from PATH
#
$ export PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin
$ which python python2.6
/usr/bin/python
/usr/bin/python2.6
$ python -V
Python 2.6.1
$ python2.6 -V
Python 2.6.1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...