Есть ли способ встроить зависимости в скрипт Python?

23

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

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

Редактировать: скрипт не обязательно должен быть .py. Пока это единственный исполняемый файл.

    
задан Jason Keene 11.07.2012 в 18:05
источник
  • Если вы можете ограничить ограничение одного файла, вы можете просто упаковать библиотеку dnspython вместе с вашим .py-файлом либо в виде zip-файла, либо как обычный автономный файл - это позволит решить проблему зависимости. Вы непреклонны в том, что у вас всего 1 файл? –  Mahmoud Abdelkader 11.07.2012 в 18:10
  • Дорога к адвеню для выдачи проложена с вложением ... –  Ignacio Vazquez-Abrams 11.07.2012 в 18:13
  • @MahmoudAbdelkader Я полагаю, что это сработает. Python будет выглядеть в текущем каталоге пакета, прежде чем искать в другом месте (хотя я думаю, что этот порядок меняется в 3). Еще хотелось бы, чтобы был способ упаковать все зависимости в виде одного исполняемого файла, который пользователь может запустить, и не имеет никаких проблем. Я полагаю, это не должно быть .py. –  Jason Keene 11.07.2012 в 18:28
  • Есть такие вещи, как py2exe и замораживание, изобретенное специально с целью распространения одного исполняемого файла. Тем не менее, это зависит от платформы. –  9000 11.07.2012 в 18:44

3 ответа

9

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

РЕДАКТИРОВАТЬ: В настоящее время я бы порекомендовал построить Pex для этого. pex - это в основном исполняемый zip-файл с зависимостями, отличными от stdlib. Он не содержит дистрибутив Python (например, py2app / py2exe), но содержит все остальное и может быть собран с помощью одного вызова командной строки. Ссылка

    
ответ дан Simeon 11.07.2012 в 18:43
  • Спасибо, я пытался получить яйцо, построенное с помощью setuptools только сейчас. Никогда не строили яйцо раньше, как я всегда слышал, что они выпали из положения. –  Jason Keene 11.07.2012 в 19:00
3

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

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

    
ответ дан jfs 11.07.2012 в 19:03
1

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

  • pydns имеет лицензию BDS, но если вы попытаетесь «встроить» модуль gpl таким образом, у вас могут возникнуть проблемы
  • вы можете научиться использовать setuptools , и в конечном итоге вы будете намного счастливее
  • setuptools будет обрабатывать установку зависимостей, которые вы определили (я не уверен, что используемые вами pydns - чистый python, поэтому вы можете создать проблемы для своих пользователей, если попытаетесь добавить его самостоятельно, не зная их среды)
  • вы можете установить url или pypi, чтобы люди могли обновить ваш скрипт с помощью easy_install -U
ответ дан Phil Cooper 11.07.2012 в 18:41
  • Я использую пакет dnspython, а не pydns. Если setuptools может создать мне один дистрибутивный исполняемый файл, который потребует только python 2.6 / 2.7, я буду использовать его. Если вы говорите, чтобы просто использовать его для установки зависимых сайтов, то это не то, о чем я просил. dnspython - это чистый python, и я не вижу ничего в его лицензии, которая помешала бы мне внедрить его. Конечные пользователи не являются разработчиками и ничего не знают о экосистеме python (setuptools / easy_install / pip / virtaulenv / etc). –  Jason Keene 11.07.2012 в 18:54