Debianzing Python-программа для получения .deb

цель

Создать устанавливаемый файл .deb (или пакет). Который при щелчке установит программное обеспечение на машине с Linux, а на панели GNOME появится значок. Чтобы запустить это приложение оттуда.

На что я ссылался

Я ссылался на два руководства по дебианизации.

Руководство 1

Руководство 2

У первого было видео, которое было невозможно понять, отчасти из-за акцента и отчасти потому, что оно безнадежно устарело (оно было загружено в 2007 г.)

А второй был полностью текстовым. Я получил до 4-го шага, Сборка пакета. Но когда я сделал это, я получил вывод, который не соответствовал тому, что было дано в руководстве.

Что мне нужно

У меня есть простая программа на Python. Он берет ваш возраст и затем печатает обратно, если возраст ниже, равен или превышает 18 лет. Для этой программы есть только один файл и никакой другой зависимости. И я хочу встроить это в .deb.

Спекуляции

-Python 2.7

-Linux Mint

редактировать

Я следовал точной структуре каталогов, как вы указали, как вы. И заменил все myscript с cowsandbulls. Сборка завершена, и я получил Debian. Когда я установил его и затем запустил команду cowsandbulls из терминала, я получил следующую ошибку:

Traceback (most recent call last):
  File "/usr/bin/cowsandbulls", line 9, in <module>
    load_entry_point('cowsandbulls==1.0', 'gui_scripts', 'cowsandbulls')()
  File "/usr/lib/python2.7/dist-packages/pkg_resources.py", line 337, in load_entry_point
    return get_distribution(dist).load_entry_point(group, name)
  File "/usr/lib/python2.7/dist-packages/pkg_resources.py", line 2311, in load_entry_point
    return ep.load()
  File "/usr/lib/python2.7/dist-packages/pkg_resources.py", line 2017, in load
    entry = __import__(self.module_name, globals(),globals(), ['__name__'])
ImportError: No module named cowsandbulls

Ответы

Ответ 1

Я только что протестировал stdeb (см. https://pypi.python.org/pypi/stdeb) пакет Python для превращения любого другого пакета Python в пакет Debian.

Сначала я установил stdeb:

apt-get install python-stdeb

Затем я сделал простой script, называемый myscript.py со следующим содержимым:

def main():
    print "Hello world, says myscript!"
    # wait for input from the user
    raw_input()

if __name__ == '__main__':
    main()

Важно отметить, что ваша структура каталогов должна быть:

somewhere/myscript/
    setup.py
    myscript/
        __init__.py
        myscript.py

В файле setup.py вы делаете что-то вроде:

import os
from setuptools import setup
from nvpy import nvpy

setup(
    name = "myscript",
    version = "1.0",
    author = "Charl P. Botha",
    author_email = "[email protected]",
    description = "Demo of packaging a Python script as DEB",
    license = "BSD",
    url = "https://github.com/cpbotha/nvpy",
    packages=['myscript'],
    entry_points = {
        'console_scripts' : ['myscript = myscript.myscript:main']
    },
    data_files = [
        ('share/applications/', ['vxlabs-myscript.desktop'])
    ],
    classifiers=[
        "License :: OSI Approved :: BSD License",
    ],
)

Директива console_scripts важна, она создаст исполняемый script, называемый my_script, который будет доступен в системном масштабе после установки результирующего DEB. Если ваш script использует что-то вроде tkinter или wxpython и имеет графический интерфейс пользователя, вы должны использовать gui_scripts вместо console_scripts.

Директива data_files установит подходящий файл рабочего стола в /usr/share/applications, чтобы вы могли также запустить myscript из среды рабочего стола. vxlabs-myscript.desktop выглядит следующим образом:

[Desktop Entry]
Version=1.0
Type=Application
Name=myscript
Comment=Minimal stdeb example
# myscript should wait for user input at the end, else the terminal
# window will disappear immediately.
Exec=myscript
Icon=/usr/share/icons/gnome/48x48/apps/file-manager.png
Categories=Utility;
# desktop should run this in a terminal application
Terminal=true
StartupNotify=true
StartupWMClass=myscript

Чтобы построить DEB, вы делаете следующее на верхнем уровне myscript:

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

Что создаст .deb в каталоге deb_dist.

После того, как я установил DEB, который я создал таким образом, я мог запустить myscript из командной строки, и я мог бы также вызвать его из среды рабочего стола.

Здесь github repo с приведенным выше примером кода: https://github.com/cpbotha/stdeb-minimal-example

Ответ 2

Правильный способ создания пакета deb использует dpkg-buildpackage, но иногда он немного сложнее. Вместо этого вы можете использовать dpkg -b <folder>, и он создаст ваш пакет Debian.

Это основы для создания пакета Debian с dpkg -b <folder> с любым двоичным кодом или с любым типом script, который запускается автоматически без ручной компиляции (Python, Bash, Pearl, Ruby):

  • Создайте файлы и папки, чтобы воссоздать следующую структуру:
    ProgramName-Version/
    ProgramName-Version/DEBIAN
    ProgramName-Version/DEBIAN/control
    ProgramName-Version/usr/
    ProgramName-Version/usr/bin/
    ProgramName-Version/usr/bin/your_script

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

  1. Измените все права доступа к папке на root:

    chown root:root -R /path/to/ProgramName-Version
    
  2. Измените разрешения script:

    chmod 0755 /path/to/the/script
    
  3. Наконец, вы можете запустить: 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://foo.com
Description: Here you can put a one line description. This is the short Description.
 Here you put the long description, indented by 1 space.

Если вы хотите построить с помощью dpkg -b <folder>, вы можете использовать эту программу, которая будет делать все с помощью одной команды. Если вы регулярно создаете пакеты, больно делать все, о чем я говорил!

* Руководство было взято из Основы пакетов Debian