Подтвердить что ты не робот

Есть ли способ встраивания зависимостей в python script?

У меня есть простой script, который имеет зависимость от dnspython для разбора файлов зон. Я хотел бы распространять этот script как единственный .py, который пользователи могут запускать только до тех пор, пока они устанавливают 2.6/2.7. Я не хочу, чтобы пользователь устанавливал зависимости на весь сайт, так как это может быть конфликты с существующими пакетами/версиями, и я не хочу, чтобы они гадали с помощью virtualenv. Мне было интересно, есть ли способ вставить пакет, например dnspython внутри script (gzip/base64), и иметь этот script доступ к этому пакету во время выполнения. Возможно, распакуйте его в каталог /tmp и добавьте его в sys.path? Я не беспокоюсь о накладных расходах на запуск, я просто хочу включить одну .py w/all dependencies, которую я могу распространять.

Кроме того, не будет никаких зависимостей C для сборки, только чистых пакетов python.

Изменить: script не должен быть .py. До тех пор, пока это один исполняемый файл.

4b9b3361

Ответ 1

Вы можете упаковать несколько файлов Python в .egg. Файлы-яйца - это, по сути, только архивы zip с четко определенными метаданными - посмотрите документацию setuptools, чтобы узнать, как это сделать. В docs вы можете сделать файлы яиц непосредственно исполняемыми, указав точку входа. Это даст вам один исполняемый файл, который может содержать ваш код + любые другие зависимости.

EDIT: В настоящее время я бы рекомендовал создать pex для этого. pex - это в основном исполняемый zip файл с зависимостями non stdlib. Он не содержит дистрибутив python (например, py2app/py2exe), но содержит все остальное и может быть построен с помощью одного вызова командной строки. https://pex.readthedocs.org/en/latest/

Ответ 2

Самый простой способ - просто поместить ваш python script с именем __main__.py с чистыми зависимостями Python в zip-архиве, .

В противном случае PyInstaller можно использовать для создания автономного исполняемого файла.

Ответ 3

не делайте этого. Если вы НЕ делаете привычки к этому.

  • pydns является лицензией BDS, но если вы попытаетесь "внедрить" модуль gpl таким образом, вы можете столкнуться с проблемами.
  • вы можете научиться использовать setuptools, и в долгосрочной перспективе вы будете намного счастливее.
  • setuptools будет обрабатывать установленные вами зависимости (я не уверен, что pydns, который вы используете, является чистым python, поэтому вы можете создавать проблемы для своих пользователей, если попытаетесь добавить его самостоятельно, не зная об окружающей среде).
  • вы можете установить url или pypi, чтобы люди могли обновить ваш script с помощью easy_install -U