Как я могу сделать модуль расширения Python упакованным в виде загружаемого egg без его установки?

StackOverflow https://stackoverflow.com/questions/737383

Вопрос

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

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

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

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

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

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

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

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

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

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

Это было полезно?

Решение

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

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

Я надеюсь, что когда-нибудь кто-нибудь еще найдет этот ответ полезным!

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top