пути к питону и порядок импорта - PullRequest
18 голосов
/ 06 марта 2012

Хорошо, так что я действительно хочу сделать это правильно, потому что я продолжаю работать с ним при генерации некоторых больших пакетов py2app / py2exe. Итак, у меня есть пакет, который содержит много модулей / пакетов, которые также могут быть в пользовательских пакетах сайта / в расположении по умолчанию (если у пользователя есть дистрибутив Python), но я хочу, чтобы мои распределенные пакеты вступили в силу перед ними при запуске из моего дистрибутива. ,

Теперь из того, что я прочитал здесь PYTHONPATH должно быть первой вещью, добавленной в sys.path после текущего каталога, однако из того, что я тестировал на своей машине, это дело не в этом, и все папки, определенные в $site-packages$/easy-install.pth, имеют приоритет над этим.

Так может кто-нибудь дать мне более подробное объяснение об этом порядке импорта // помочь мне найти способ установить переменные окружения таким образом, чтобы распространяемые мной пакеты имели приоритет над установленными по умолчанию. Пока что моя попытка, например, в Mac-OS py2app, в моем сценарии точки входа:

 os.environ['PYTHONPATH'] = DATA_PATH + ':'
 os.environ['PYTHONPATH'] = os.environ['PYTHONPATH'] + os.path.join(DATA_PATH
                                                            , 'lib') + ':'
 os.environ['PYTHONPATH'] = os.environ['PYTHONPATH'] + os.path.join(
                                DATA_PATH, 'lib', 'python2.7', 'site-packages') + ':'
 os.environ['PYTHONPATH'] = os.environ['PYTHONPATH'] + os.path.join(
                          DATA_PATH, 'lib', 'python2.7', 'site-packages.zip')

Это в основном структура пакета, сгенерированного py2app. Тогда я просто:

 SERVER = subprocess.Popen([PYTHON_EXE_PATH, '-m', 'bin.rpserver'
                            , cfg.RPC_SERVER_IP, cfg.RPC_SERVER_PORT],
                            shell=False, stdin=IN_FILE, stdout=OUT_FILE, 
                            stderr=ERR_FILE)

Здесь PYTHON_EXE_PATH - это путь к исполняемому файлу python, который py2app добавляет в пакет. Теперь это прекрасно работает на машине, на которой не установлен python. Однако, когда дистрибутив Python уже присутствует, их пакеты сайтов имеют преимущество.

1 Ответ

16 голосов
/ 06 марта 2012

Python ищет пути в sys.path по порядку (см. http://docs.python.org/tutorial/modules.html#the-module-search-path). easy_install меняет этот список напрямую (см. Последнюю строку в вашем файле easy-install.pth):

import sys; new=sys.path[sys.__plen:]; del sys.path[sys.__plen:]; p=getattr(sys,'__egginsert',0); sys.path[p:p]=new; sys.__egginsert = p+len(new)

Это в основном берет все каталоги, которые добавляются, и вставляет их в начало списка.

Также смотрите Яйца в пути перед переменной среды PYTHONPATH .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...