Как пакет Debian может установить модули Python из PyPI?

20

Этот вопрос пытается дополнить этот . У меня есть приложение Python, которое использует сторонние модули из PyPI. Я хочу упаковать свое приложение в пакет Debian, но не знаю, как обрабатывать зависимости Python, которых нет в репозиториях Debian / Ubuntu (также упакованы в пакеты Debian)

Решение № 1:
собрать модули из PyPI прямо в мой пакет Debian.

Решение №2:
создайте пакеты debian для всех необходимых мне модулей PyPI, используя stdeb, и добавьте их в репозитории debian / ubuntu.

На самом деле мне нужно решение № 3, потому что я хочу устанавливать зависимости PyPI при установке пакета debian, предпочтительно в virtualenv!

Каким было бы Решение № 3 ? Нужно ли настраивать скрипт DEBIAN / preinst сопровождающий?

andri_ch
источник
Можете ли вы описать, почему вам нужно создать пакет Debian? Нужно ли вашему Python-приложению ресурсы, отличные от Python?
Джонатан
@Jonathan Я хочу, чтобы пользователи могли устанавливать мое приложение из Ubuntu Software Center. Я думаю, мне нужен * .deb для этого. Моему приложению Python не нужны ресурсы, отличные от Python, только сторонние модули Python.
andri_ch
@Jonathan Пакеты Debian - это стандартный метод установки в Ubuntu. Можно легко распространять .debфайл или настроить частный репозиторий или PPA в Launchpad.
МестреЛион

Ответы:

20

Я говорил с некоторыми сопровождающими на IRC-канале Debian irc: //irc.debian.org#debian-mentors , спрашивая о том же, и общий консенсус был:

Решение № 1:

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

Решение № 3:

Загрузка не-debian пакетов на лету при установке бинарного ( .deb) представляет серьезную угрозу безопасности, определенно нет. Вы даже не сможете проверить зависимости путем извлечения deb, потому что они загружаются и устанавливаются во время установки. Это подход, который полностью обходит систему хранилищ. Ни один заинтересованный пользователь не будет доволен пакетом, который за кулисами (и как root, помните!) Загружает дополнительное ненадежное программное обеспечение из ненадежных источников. Да, это потребовало бы возиться с DEBIAN/postinst(или preinst) и выдать wget(или, в вашем случае,pip install), и именно такой подход используют Flash, Oracle Java, Steam и другие. Но это проприетарное программное обеспечение с закрытыми исходными кодами, так что их безопасность в любом случае отсутствует.

Решение № 1.5:

Вы не упомянули, но вы могли бы интегрировать зависимости только на время сборки , то есть в исходном пакетом ( .orig.tar.gz, .debian.tar.gz, .dscтриады), скачав из PyPi при создании «двоичный» пакет (в .deb). Инструкции для ( в отличие от бинарного пакета) pip installбудут записаны debian/rules(обратите внимание на строчные буквы debian) и будут выполняться при запуске debuildили dpkg-buildpackage.

Это золотая середина между # 1 и # 3. Это смягчает (но не решает!) Некоторые проблемы # 3: по крайней мере, вы можете проверить конечный продукт, и для .debэтого не потребуется доступ в Интернет во время установки. Все риски и нагрузки переносятся от конечного пользователя к сопровождающему пакета. Но имеет те же проблемы, что и № 1, поскольку он обходит большую часть инфраструктуры упаковочной системы. В конце концов, обработка зависимостей (версий, обновлений, требований, конфликтов) - вот почему dpkg/ aptбыла создана в первую очередь! :)

Решение № 2:

Единый Истинный Правильный путь ™ . Вы создаете пакеты Debian для своих зависимостей, перечисляете их как требования в вашем пакете и отправляете все .debsпакеты или исходные коды.

Оттуда у вас есть несколько вариантов:

  • Отправьте исходные пакеты, как ваше программное обеспечение, так и его зависимости, для включения в Debian. Если они будут приняты, они будут автоматически доступны всем пользователям Debian, включая все производные, такие как Ubuntu.

  • Загрузите исходные пакеты на Launchpad , создавая таким образом PPA, который любой пользователь Ubuntu (и его производные, такие как Linux Mint) может легко добавить и установить

  • Разместите на своем веб-сайте свой собственный репозиторий Debian, чтобы пользователи из любой системы на основе Debian могли добавить к ним /etc/apt/sources.list.dи использовать aptинфраструктуру для загрузки, установки и обновления (как описано выше!)

  • Разместите .debфайлы для прямой загрузки и установки. Нет aptили автоматические обновления, связанные мысли.

Что касается того, как упаковать ваши зависимости PyPi (и ваше программное обеспечение python!), Есть ряд инструментов и ссылок, которые облегчают процесс:

  • stdeb , как вы упомянули. Олди и гуди.

  • Pybuild , новый удивительный инструмент от Debian, который заменяет собой stdeb.

И много полезных ссылок:

Нужна помощь? Проверьте это:

MestreLion
источник
2

Есть pypi2debвзять пакет из pypi и превратить его в пакет deb.

LtWorf
источник
0

Это не так, как cpan в perl, если у вас есть в репозиториях, вы можете установить с помощью apt-get, если не можете установить с помощью pip, разница должна быть в том, что pip устанавливается в / usr / local.

Для установки с помощью pip вы можете сделать:

apt-get install python-pip 
pip install foopackage 

например:

pip install MultipartPostHandler2
Сержио
источник
Это не отвечает на вопрос ОП. Вопрос заключается в том, как заставить пакет Debian установить пакет Python из PyPi, чтобы 'apt-get <custom-package>' или 'dpkg -i <custom-package>' извлекал зависимости Python из PyPi.
SevakPrime
Это не так, это как cpan в perl, если у вас есть в репозиториях, вы можете установить с помощью apt-get, если не можете установить с помощью pip, разница должна заключаться в том, что pip устанавливается в / usr / local, но, возможно, это будет лучше удали мой ответ.
Сержио
Ваш комментарий дает соответствующий ответ на вопрос ОП. Вы должны поместить этот комментарий в свой ответ, чтобы быть проголосовавшим. (Например, см. Ответ MestreLion.) Как есть, ваш ответ не отвечает на вопрос ОП.
SevakPrime