Как сделать модуль расширения Python, упакованный как яйцо, загружаемым без его установки? - PullRequest
0 голосов
/ 10 апреля 2009

Я нахожусь в процессе доработки наших сценариев сборки на основе замечательного инструмента Waf (я использовал SCons целую вечность, но его способ слишком медленный).

В любом случае, я столкнулся со следующей ситуацией и не могу найти ее решение:

  • У меня есть продукт, который зависит от количества ранее созданных яичных файлов.
  • Я пытаюсь упаковать продукт, используя PyInstaller как часть процесса сборки.
  • Сначала я строю зависимости.
  • Далее я хочу запустить PyInstaller для упаковки продукта, который зависит от яиц, которые я собрал. Мне нужно, чтобы PyInstaller мог загружать эти файлы яиц как часть процесса упаковки.

Звучит просто: вы понимаете, что должно быть PYTHONPATH, создаете копию sys.environ, правильно устанавливающую переменную, и затем вызываете скрипт PyInstaller, используя subprocess.Popen, передавая ранее сконфигурированную среду в качестве аргумента env.

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

Если я разархивирую яйца (переименовав каталоги в .egg), я могу импортировать их без дальнейших настроек, но в данном случае это не то, что мне нужно.

Я также могу заставить яйца импортировать из подоболочки, выполнив следующие действия:

  • Установка PYTHONPATH в каталог, содержащий яйцо, которое вы хотите импортировать (не путь к самому яйцу)
  • Загрузка оболочки Python и использование pkg_resources.require, чтобы найти яйцо.

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

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

Ответы [ 2 ]

3 голосов
/ 10 апреля 2009

Хех, я думаю, это было плохо. Похоже, проблема заключалась в том, что флаг zipsafe в файле setup.py для пакета расширения был установлен в значение False, что, по-видимому, влияет на вашу способность воспринимать его как таковое вообще.

Теперь, когда я установил значение True, я могу импортировать файлы яиц, просто добавив каждый из них в PYTHONPATH.

Я надеюсь, что кто-то найдет этот ответ полезным однажды!

1 голос
/ 10 апреля 2009

Хотя у вас есть решение, вы всегда можете попробовать «virtualenv», который создает виртуальную среду python, в которой вы можете устанавливать и тестировать пакеты Python, не связываясь с основной системой python:

http://pypi.python.org/pypi/virtualenv

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