Gibt es eine Standardmethode zum Erstellen von Debian-Paketen für die Verteilung von Python-Programmen?

78

Es gibt eine Menge Informationen darüber, aber da "es mehr als einen Weg gibt, eine Katze zu häuten" , scheinen alle Tutorials / Handbücher, die einen Teil des Prozesses abdecken, bestimmte Annahmen zu treffen, die sich von anderen unterscheiden Tutorials, ich habe es immer noch nicht verstanden.

Bisher habe ich das verstanden.

  1. Mein letztes Ziel sollte es sein, ein "binäres" .deb-Paket zu erstellen. Ein solches Paket ist plattformunabhängig (32/64 Bit), da alle Python-Programme solche sind.
  2. Um ein "binäres" Paket zu erstellen, muss ich zuerst ein Quellpaket erstellen.
  3. Um das Quellpaket zu erstellen, kann ich entweder CDBSoder verwenden debhelper. Debhelper ist der empfohlene Weg für Anfänger.
  4. Der Kern der Erstellung eines Quellpakets besteht darin, das DEBIANVerzeichnis im Quellverzeichnis mit einer Reihe von Dateien zu füllen, in denen erläutert wird, wo Dateien kopiert werden müssen, welchen Urheber- und Lizenzierungsschemata sie unterliegen, welchen Abhängigkeiten sie unterliegen usw.
  5. Schritt 4 kann den dh_makeBefehl weitgehend automatisieren, wenn die Python-Quelle auch ein Distutils- setup.pySkript enthält.

Nun meine Fragen:

  1. Ist mein Verständnis des Prozesses korrekt? Fehlt mir etwas oder habe ich mich geirrt?
  2. Schritt 5 ist für mich wirklich verwirrender: Insbesondere die beiden Punkte, die für mich am dunkelsten bleiben, sind:
    • Wie schreibe ich ein setup.pySkript, das ein eigenständiges Programm installiert? BEARBEITEN: Mit eigenständigem Programm meine ich ein Programm, das von einem Desktop-Benutzer verwendet werden soll (im Gegensatz zu einem Modul, das ich als eine Sammlung von Funktionen verstehe, die von anderer Software nach dem Import verwendet werden sollen). In meinem speziellen Fall würde ich tatsächlich zwei solche "Programme" benötigen : die Hauptsoftware und ein separates Dienstprogramm ( tatsächlich ein zweites "Programm", das sich im selben Paket wie das andere befinden sollte).
    • Was sind die Besonderheiten eines solchen Skripts für DEB-Pakete? Die offizielle Dokumentation scheint sich nur mit RPM- und Windows-Dingen zu befassen ...

Übrigens: Dies sind die besten Informationsquellen, die ich bisher finden konnte. Wenn Sie etwas Besseres haben, teilen Sie es bitte mit! :) :)

Mac
quelle
1
Bevor Sie ein Python-Programm für das binäre Packen vorbereiten können, müssen Sie es für die allgemeine Verteilung vorbereiten. Das ist das setup.pybisschen. Dies ist vergleichbar mit dem autotoolsSchritt, den viele GNU C / C ++ - Projekte verwenden, jedoch spezifisch für Python. Dies ist einfacher als es sich anhört, lesen Sie docs.python.org/distutils/index.html
SingleNegationElimination
1
@TokenMacGuy - Danke, ich habe bereits die allgemeine Idee (mein Wortlaut ist möglicherweise falsch, aber das ist Teil 5 des von mir beschriebenen Prozesses). Was mich verwirrt ist, dass ich in der offiziellen Dokumentation keine explizite Anleitung zum Verteilen von eigenständigen Programmen anstelle von Modulen finden konnte. Vielleicht ist es nur ein Terminologieproblem und was ich als "Standalone-Programme" bezeichne, ist eine bestimmte Art von Modulen?
Mac
1
@mac: Sie können Skripte installieren, dh ausführbare Dateien, um Ihr Programm zu starten. Siehe docs.python.org/distutils/setupscript.html#installing-scripts
Thomas K
@Thomas - Ich habe das schon einmal gelesen, bin aber immer noch verwirrt: Mein Programm hat eine main.pyDatei (ich nehme an, Sie nennen es "ein Skript") UND eine Reihe von Modulen UND einige andere YAML- und SVG-Dateien ... Ich bin immer noch Schwierigkeiten, eine klare Dokumentation zu finden, wie dies erreicht werden kann. Das Beste, was ich bisher finden konnte, ist das Distutils-Tutorial, das ich noch studiere ...
Mac
Mit eigenständigem Programm meinen Sie etwas, das Python nicht als Abhängigkeit hat? Neuere Versionen von Debian und Ubuntu enthalten mindestens Python 2.6. Wenn Ihr Code also 2.6-kompatibel ist, kann ein "eigenständiges Programm" tatsächlich nur ein Sonderfall eines Moduls sein, wie Sie vorgeschlagen haben.
Wilduck

Antworten:

28

Es sieht so aus, als würde stdeb tun, was Sie wollen.

Für die Installation von Skripten empfehle ich dringend, die Einstiegspunktunterstützung für console_scripts von Distribute zu unterstützen.

Ross Patterson
quelle
1
Sehr sehr sehr nützlich, danke! (+1) Ich werde diese Straße in den kommenden Tagen testen und berichten.
Mac
1
Das war in der Tat der richtige Weg (zumindest für mich). Nochmals vielen Dank, Antwort akzeptiert.
Mac
3
Der Link "console_scripts der Distribution" funktioniert nicht.
Czarek Tomczak
@CzarekTomczak, vielleicht hilft das .
Oblalex
Ich habe eine handgeschriebene DEBIAN/control. Gibt es eine Möglichkeit, es zu stdebnutzen?
St.Antario
10

Dieser Artikel von Barry Warsaw hat mir geholfen, ziemlich weit durch den Prozess zu kommen. Ich musste trotzdem nebenbei viel suchen und habe in der Vergangenheit den größten Teil des Ubuntu-Verpackungshandbuchs gelesen .

Ein gutes zu haben setup.pyist ein wirklich guter Rat. Ich fand diese beiden Anleitungen ziemlich gut:

Metakermit
quelle
2
Beachten Sie, dass das Per Anhalter durch das Python Packaging-Benutzerhandbuch ersetzt wurde .
Tshepang
Oh Danke! Beide behandeln jedoch nur die Grundlagen von Distutils. Die Distribute-Dokumentation enthält etwas mehr Details und ist die empfohlene Lösung (zum Zeitpunkt des Schreibens dieses Kommentars).
Metakermit
1
Barrys Blog wurde aktualisiert und empfiehlt den Leitfaden wiki.debian.org/Python/LibraryStyleGuide . Es hat bei mir funktioniert.
Lucas
Das Ubuntu Packaging-Handbuch für Python funktioniert nicht mehr.
Archisman Panigrahi
8

Die richtige Art, ein Deb-Paket zu erstellen, ist die Verwendung dpkg-buildpackage, aber manchmal ist es etwas kompliziert. Stattdessen können Sie verwenden dpkg -b <folder>, und es wird Ihr Debian-Paket erstellen.

Dies sind die Grundlagen zum Erstellen eines Debian-Pakets mit einer dpkg -b <folder>beliebigen Binärdatei oder einem beliebigen Skript, das automatisch ausgeführt wird, ohne dass eine manuelle Kompilierung erforderlich ist (Python, Bash, Perl und Ruby):

  1. Erstellen Sie die Dateien und Ordner, um die folgende Struktur wiederherzustellen:

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

    Die unter platzierten Skripte /usr/bin/werden direkt vom Terminal aufgerufen. Beachten Sie, dass ich dem Skript keine Erweiterung hinzugefügt habe. Sie können auch feststellen, dass die Struktur des Deb-Pakets die Struktur des Programms ist, sobald es installiert ist. Wenn Sie also dieser Logik folgen, wenn Ihr Programm eine einzelne Datei enthält, können Sie diese direkt unter platzieren ProgramName-Version/usr/bin/your_script. Wenn Sie jedoch mehrere Dateien haben, sollten Sie diese unter ProgramName-Version/usr/share/ProgramName/all your filesund nur eine Datei unter platzieren /usr/bin/, von der aus Ihre Skripte aufgerufen werden/usr/share/ProgramName/

  2. Ändern Sie alle Ordnerberechtigungen in root:

    chown root:root -R /path/to/ProgramName-Version
    
  3. Ändern Sie die Berechtigungen des Skripts:

    chmod 0755 /path/to/the/script
    
  4. Endlich können Sie ausführen: dpkg -b /path/to/the/ProgramName-Versionund Ihr Deb-Paket wird erstellt! (Sie können auch die Post / Pre-Inst-Skripte hinzufügen und alles, was Sie wollen, funktioniert wie ein normales Debian-Paket.)


Hier ist ein Beispiel für die controlDatei. Sie müssen es nur kopieren, in eine leere Datei namens "control" einfügen und in den Ordner DEBIAN legen.

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.
Rafael Senties Martielli
quelle
2
Diese Lösung war genau das, was ich brauchte, nachdem ich versucht hatte, mit stdeb ein python3-Paket zu erstellen, für das pyqt5 erforderlich war. Vielen Dank an Rafael. Ich entschuldige mich auch dafür, dass ich bei dieser Lösung versehentlich auf die Schaltfläche zum Abstimmen geklickt habe - ich kann meine Stimme anscheinend nicht ändern.
Curtis Gedak
Ich habe gerade versucht, erneut auf das Downvote (und auch auf das Upvote) zu klicken, und ich erhalte die folgende Nachricht: Sie haben zuletzt am 17. November um 21:25 Uhr über diese Antwort abgestimmt. Ihr Vode ist jetzt gesperrt, es sei denn, die Antwort wird bearbeitet. Vielleicht könnte ich meine Stimme ändern, wenn Sie die Antwort bearbeiten würden? Nochmals vielen Dank @rsm für Ihre Antwort. Es hat mir geholfen, ein DEB-Paket für das Manuskript zu erstellen.
Curtis Gedak
4

Es gibt mehrere Bibliotheken, die alle erforderlichen Schritte abstrahieren und es Ihnen ermöglichen, Ihr Python-Paket mit einem einzigen Befehl in ein Debian-Paket umzuwandeln.

Angenommen, Ihr Python-Paket verfügt bereits über Folgendes setup.py: In dem Verzeichnis, in dem sich das Paket setup.pybefindet, können Sie Folgendes verwenden:

  • stdeb (Bereits in dieser Antwort erwähnt , installieren mit pip install stdeb). Führen Sie Folgendes aus, um ein Debian-Paket zu erstellen:

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

    Die Ausgabedatei .debbefindet sich im bdist_debVerzeichnis.

  • fpm (installieren mit gem install --no-ri --no-rdoc fpm). Führen Sie Folgendes aus, um ein Debian-Paket zu erstellen:

    fpm -s python -t deb setup.py
    
  • py2deb (installieren mit pip install py2deb). Führen Sie Folgendes aus, um ein Debian-Paket zu erstellen:

    py2deb -r . .
    

Jede dieser Bibliotheken hat ihre eigenen Einschränkungen. Vielleicht möchten Sie ausprobieren, was für Sie am besten funktioniert.

Jakub Kukul
quelle
0

Diese Methode funktioniert bei mir.

  1. installiere stdeb. (pip install stdeb)

  2. erstelle setup.py. Ich benutze PyCharm. Dadurch werden diese Befehle ( https://www.jetbrains.com/help/pycharm/creating-and-running-setup-py.html ) in Ihr Projektverzeichnis geschrieben.

  3. sudo apt-get install python3-stdeb fakeroot python-all
  4. python3 setup.py sdist
  5. sudo python3 setup.py --command-packages = stdeb.command bdist_deb
  6. Ihre Deb-Datei befindet sich im Verzeichnis deb_dist in Ihrem Projekt
Tolga Sahin
quelle