Хорошо, так что я действительно хочу сделать это правильно, потому что я продолжаю работать с ним при генерации некоторых больших пакетов 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 уже присутствует, их пакеты сайтов имеют преимущество.