Чи існує стандартний спосіб створення пакетів Debian для розповсюдження програм Python?


81

Існує маса інформації про те, як це зробити, але з тих пір "існує більше одного способу зняти шкіру з кота" , і всі навчальні посібники / посібники, які охоплюють деякий процес, схоже, роблять певні припущення, які відрізняються від інших підручники, мені все одно не вдалося зрозуміти це.

Поки що це, на мою думку, я зрозумів.

  1. Моєю кінцевою метою має стати створення "двійкового" пакета .deb. Такий пакет буде незалежним від платформи (32/64 біт), оскільки всі програми Python є такими.
  2. Для створення "двійкового" пакету мені спочатку потрібно створити вихідний пакет.
  3. Для створення вихідного пакету я можу використовувати CDBSабо debhelper. Debhelper - рекомендований спосіб для початківців.
  4. Основою створення вихідного пакету є заповнення DEBIANкаталогу у вихідному каталозі кількома файлами, що уточнюють, де потрібно копіювати файли, яким авторським правом та схемою ліцензування вони підлягають, які залежності вони мають тощо ...
  5. Крок # 4 може бути в значній мірі автоматизований dh_makeкомандою, якщо джерело Python також постачається зі скриптом distutils setup.py.

Тепер мої запитання:

  1. Чи правильно я розумію процес? Щось мені не вистачає або щось, що я помилився?
  2. Крок No5 насправді більш заплутаний для мене: саме два моменти, які для мене залишаються найбільш незрозумілими:
    • Як написати setup.pyсценарій, який встановлює автономну програму? EDIT: Під автономною програмою я маю на увазі програму, призначену для використання користувачем робочого столу (на відміну від модуля, який я розумію як сукупність функціональних можливостей, що використовуються іншим програмним забезпеченням після імпорту). У моєму конкретному випадку мені насправді були б потрібні дві такі "програми": основне програмне забезпечення та окрема утиліта (фактично друга "програма", яка повинна бути в одному пакеті з іншою).
    • У чому особливості такого сценарію для пакетів DEB? Офіційна документація, схоже, стосується лише RPM та Windows-матеріалів ...

BTW: Це найкращі джерела інформації, які я міг знайти собі на сьогодні. Якщо у вас є щось краще, ніж це, будь ласка, поділіться! :)


2
Перш ніж ви зможете підготувати програму python для двійкової упаковки, вам потрібно підготувати її до загального розповсюдження. Це setup.pyтрохи. Це можна порівняти із autotoolsкроком, який використовують багато проектів GNU C / C ++, але специфічним для python. Це простіше, ніж здається, читайте docs.python.org/distutils/index.html
SingleNegationElimination

1
@TokenMacGuy - Дякую, я вже маю загальну думку (моє формулювання може бути неправильним, але це частина 5 процесу, яку я описую). Мене бентежить те, що в офіційній документації я не міг знайти чітких інструкцій щодо розподілу автономних програм, а не модулів. Можливо, це просто проблема термінології, і те, що я називаю "самостійними програмами", - це специфічний тип модулів?
mac

1
@mac: Ви можете встановити сценарії, тобто виконувані файли, щоб запустити програму. Див. Docs.python.org/distutils/setupscript.html#installing-scripts
Thomas K

@Thomas - Я читав це раніше, але все ще бентежусь: у моїй програмі є main.pyфайл (я вважаю, ви можете назвати його "сценарієм") І ряд модулів І деякі інші файли YAML та SVG ... Я все ще намагається знайти чітку документацію про те, як цього досягти. Найкраще, що я міг поки що знайти, - це підручник з distutils, який я все ще вивчаю ...
mac

Під автономною програмою ви розумієте щось, що не матиме python як залежність? Останні випуски Debian та Ubuntu містять принаймні python 2.6, тому, якщо ви сумісні з кодом 2.6, "автономна програма" насправді може бути лише особливим випадком модуля, як ви запропонували.
Wilduck

Відповіді:


30

Схоже, stdeb зробить те, що ти хочеш.

Крім того, для встановлення сценаріїв я настійно рекомендую розподіляти підтримку точки входу console_scripts .


1
Дуже дуже дуже корисно, дякую! (+1) Я протестую цю дорогу найближчими днями та повідомлю про це.
mac

1
Це справді був шлях (принаймні для мене). Ще раз спасибі, відповідь прийнято.
mac

3
Посилання "distribute's console_scripts" не працює.
Чарек Томчак

@CzarekTomczak, можливо, це допоможе .
oblalex 02

У мене від руки написано DEBIAN/control. Чи є спосіб цим stdebскористатися?
Санкт-Антаріо

10

Ця стаття Баррі Варшави допомогла мені пройти досить далеко у процесі. Однак мені все одно довелося багато шукати збоку, і я читав більшість посібників з упаковки Ubuntu деякий час у минулому.

Наявність хорошого setup.py- це дійсно хороша порада. Я знайшов ці два посібники цілком непоганими:


2
Зверніть увагу, що Керівництво автостопа замінено Посібником користувача з упаковки Python .
tshepang

О, дякую! Хоча, вони обидва висвітлюють лише самі головні основи дистутілів. Документація "Розподілити" містить трохи більше деталей і є рекомендованим рішенням (на момент написання цього коментаря).
metakermit

1
Блог Баррі був оновлений та рекомендує керівництво wiki.debian.org/Python/LibraryStyleGuide . У мене це спрацювало.
Лукас,

Посібник з упаковки Ubuntu для python більше не працює.
Архісман Паніграхі

9

Правильний спосіб створення пакета deb - це використання dpkg-buildpackage, але іноді це дещо складно. Натомість ви можете використовувати dpkg -b <folder>, і він створить ваш пакет Debian.

Це основи створення пакета Debian dpkg -b <folder>з будь-яким двійковим файлом або з будь-яким скриптом, який запускається автоматично без необхідності ручної компіляції (Python, Bash, Perl та Ruby):

  1. Створіть файли та папки, щоб відтворити таку структуру:

    ProgramName-Version/
    ProgramName-Version/DEBIAN
    ProgramName-Version/DEBIAN/control
    ProgramName-Version/usr/
    ProgramName-Version/usr/bin/
    ProgramName-Version/usr/bin/your_script
    

    Сценарії, розміщені в, /usr/bin/викликаються безпосередньо з терміналу, зауважте, що я не додав розширення до сценарію. Також ви можете помітити, що структура пакета deb буде структурою програми після її встановлення. Отже, якщо ви дотримуєтесь цієї логіки, якщо у вашій програмі є один файл, ви можете розмістити його безпосередньо під ProgramName-Version/usr/bin/your_script, але якщо у вас кілька файлів, вам слід помістити їх ProgramName-Version/usr/share/ProgramName/all your filesі помістити лише один файл, /usr/bin/який буде викликати ваші скрипти з/usr/share/ProgramName/

  2. Змініть усі дозволи на папку на root:

    chown root:root -R /path/to/ProgramName-Version
    
  3. Змініть дозволи сценарію:

    chmod 0755 /path/to/the/script
    
  4. Нарешті, ви можете запустити: dpkg -b /path/to/the/ProgramName-Version і ваш пакет deb буде створений! (Ви також можете додати сценарії post / pre inst і все, що забажаєте, це працює як звичайний пакет Debian)


Ось приклад controlфайлу. Вам потрібно лише скопіювати та вставити його в порожній файл, який називається "control", і помістити в папку DEBIAN.

Package: ProgramName
Version: VERSION
Architecture: all
Maintainer: YOUR NAME <EMAIL>
Depends: python2.7, etc , etc,
Installed-Size: in_kb
Homepage: http://example.com
Description: Here you can put a one line description. This is the short Description.
 Here you put the long description, indented by one space.

2
Це рішення було саме тим, що мені було потрібно після удару по дорожній перешкоді, намагаючись використовувати stdeb для створення пакету python3, який вимагав pyqt5. Велика подяка Рафаелю. Крім того, я прошу вибачення за випадкове натискання кнопки "вниз" для цього рішення - я, здається, не можу змінити свій голос.
Кертіс Гедак,

Я просто спробував ще раз натиснути на "проти" (і також "проти"), і я отримую таке повідомлення: Ви востаннє проголосували за цю відповідь 17 листопада о 21:25. Тепер ваші води заблоковані, якщо відповідь не відредаговано. Можливо, якби ви відредагували відповідь, я міг би змінити свій голос? Ще раз дякую @rsm за вашу відповідь. Це допомогло мені створити пакет DEB для manuskript.
Кертіс Гедак,

чи можна за допомогою цього підходу змінити шлях встановлення? Я міг лише знайти спосіб змінити префікс (використовуючи override_dh_auto_installу файлі правил), але не налаштувати весь шлях
ignacio

@ignacio, як я вже говорив, структура пакету deb - це та, яка буде розгорнута в інсталяції. Ви повністю вільні від використання будь-якого шляху, який хочете.
RSM

5

Є кілька бібліотек, які абстрагують усі необхідні кроки і дозволяють перетворити ваш пакет Python в пакет Debian за допомогою однієї команди.

Якщо припустити, що у вашому пакунку python вже є файл setup.py, у каталозі, де setup.pyвін знаходиться, ви можете використовувати:

  • stdeb (Вже зазначено в цій відповіді , встановіть за допомогою pip install stdeb). Щоб створити пакет Debian, запустіть:

    python setup.py --command-packages=stdeb.command bdist_deb
    

    Вихідний .debфайл буде розміщений у bdist_debкаталозі.

  • fpm (встановити за допомогою gem install --no-ri --no-rdoc fpm). Щоб створити пакет Debian, запустіть:

    fpm -s python -t deb setup.py
    
  • py2deb (встановити за допомогою pip install py2deb). Щоб створити пакет Debian, запустіть:

    py2deb -r . .
    

Кожна з цих бібліотек має свої застереження, тому, можливо, ви захочете спробувати те, що вам найкраще підходить.


0

Цей метод працює для мене.

  1. встановити stdeb. (pip встановити stdeb)

  2. створити setup.py. Я використовую PyCharm. Це буде ( https://www.jetbrains.com/help/pycharm/creating-and-running-setup-py.html ) писати ці команди в каталозі вашого проекту.

  3. sudo apt-get install python3-stdeb підроблений python-all
  4. python3 setup.py sdist
  5. sudo python3 setup.py --command-пакети = stdeb.command bdist_deb
  6. ваш файл deb знаходиться у каталозі deb_dist, який знаходиться у вашому проекті
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.