Wie kann ein Debian-Paket Python-Module von PyPI installieren?

20

Diese Frage soll diese ergänzen . Ich habe eine Python-App, die Drittanbieter-Module von PyPI verwendet. Ich möchte meine App in ein Debian-Paket packen, weiß aber nicht, wie ich mit Python-Abhängigkeiten umgehen soll, die sich nicht in Debian / Ubuntu-Repositories befinden (auch als Debian-Pakete gepackt).

Lösung 1:
Bauen Sie die Module von PyPI direkt in mein Debian-Paket ein.

Lösung 2:
Erstellen Sie Debian-Pakete für alle PyPI-Module, die ich mit stdeb benötige, und fügen Sie sie zu Debian / Ubuntu-Repositorys hinzu.

Ich brauche tatsächlich eine Lösung Nr. 3, weil ich PyPI-Abhängigkeiten installieren möchte, wenn ich mein Debian-Paket installiere, am besten in einer virtuellen Umgebung!

Was wäre Lösung 3 ? Muss ich das DEBIAN / Preinst- Betreuer-Skript optimieren ?

andri_ch
quelle
Können Sie beschreiben, warum Sie ein Debian-Paket erstellen müssen? Benötigt Ihre Python-App Ressourcen, die nicht von Python stammen?
Jonathan
@ Jonathan Ich möchte, dass Benutzer meine App über das Ubuntu Software Center installieren können. Ich glaube, ich brauche eine * .deb dafür. Meine Python-App benötigt keine Nicht-Python-Ressourcen, sondern nur Python-Module von Drittanbietern.
andri_ch
@ Jonathan Debian-Pakete sind die Standard-Installationsmethode in Ubuntu. Sie können problemlos eine .debDatei verteilen oder ein privates Repository oder eine PPA in Launchpad einrichten.
MestreLion

Antworten:

20

Ich habe mit einigen Betreuern des Debian-IRC-Kanals irc: //irc.debian.org#debian-mentors gesprochen und genau das Gleiche gefordert , und der allgemeine Konsens war:

Lösung 1:

Das Integrieren von Abhängigkeiten in Ihr Paket durch Kopieren der Quelldateien als einzelne Codebasis wird sehr verpönt. Dies würde den Zweck eines Paketsystems zunichte machen, das Abhängigkeiten, Aktualisierungen, Versionsverwaltung usw. handhabt.

Lösung 3:

Das direkte Herunterladen von Nicht-Debian-Paketen bei der Installation von binary ( .deb) ist ein ernstes Sicherheitsrisiko, definitiv ein Nein-Nein. Sie könnten die Abhängigkeiten nicht einmal untersuchen, indem Sie die extrahieren deb, da sie bei der Installation heruntergeladen und installiert werden. Dieser Ansatz umgeht das Repository-System vollständig. Kein betroffener Benutzer würde sich über ein Paket freuen, das hinter den Kulissen (und wie rootgesagt!) Zusätzliche nicht vertrauenswürdige Software von nicht vertrauenswürdigen Quellen herunterlädt. Ja, dazu müsste man sich mit DEBIAN/postinst(oder preinst) beschäftigen und ein wget(oder, in Ihrem Fall,pip install), und das ist der Ansatz von Flash, Oracle Java, Steam und anderen. Das ist jedoch proprietäre, geschlossene Quellensoftware, sodass ihre Sicherheit sowieso keine ist.

Lösung Nr. 1.5:

Sie haben es nicht erwähnt, aber man konnte die Abhängigkeiten nur integrieren Build - Zeit , dh in der Quelle - Paket (die .orig.tar.gz, .debian.tar.gz, .dscTrias), indem sie von PyPI Download , wenn die „binäre“ Paket (das Erstellen .deb). Die Anweisungen für die pip installgehen in debian/rules(beachten Sie die Kleinbuchstaben debianim Gegensatz zum Binärpaket) und werden ausgeführt, wenn Sie debuildoder ausgeben dpkg-buildpackage.

Dies ist ein Mittelweg zwischen # 1 und # 3. Dies mindert (aber nicht löst!) Einige der Probleme von Nummer 3: Zumindest können Sie das Endprodukt überprüfen und .debbenötigen zum Zeitpunkt der Installation keinen Internetzugang. Alle Risiken und Belastungen gehen vom Endverbraucher auf den Paketbetreuer über. Es hat jedoch die gleichen Probleme wie Nummer 1, da es den größten Teil der Verpackungssysteminfrastruktur umgeht. Der Umgang mit Abhängigkeiten (Versionen, Updates, Anforderungen, Konflikten) ist schließlich der Grund, warum dpkg/ aptwurde in erster Linie erstellt! :)

Lösung 2:

Der einzig wahre richtige Weg ™ . Sie erstellen Debian-Pakete für Ihre Abhängigkeiten, listen sie als Anforderungen in Ihrem Paket auf und versenden alle .debsoder Quellpakete.

Von dort haben Sie eine Reihe von Optionen:

  • Senden Sie die Quellpakete, sowohl Ihre Software als auch deren Abhängigkeiten, zur Einbindung in Debian. Wenn sie akzeptiert werden, stehen sie automatisch allen Debian-Benutzern zur Verfügung, einschließlich aller Derivate wie Ubuntu.

  • Laden Sie die Quellpakete auf Launchpad hoch und erstellen Sie so eine PPA , die jeder Ubuntu-Benutzer (und seine Derivate wie Linux Mint) problemlos hinzufügen und installieren kann

  • Hosten Sie Ihr eigenes Debian-Repository auf Ihrer Website, das Benutzer von jedem Debian-basierten System hinzufügen /etc/apt/sources.list.dund die aptInfrastruktur zum Herunterladen, Installieren und Aktualisieren verwenden können (wie oben beschrieben!).

  • Hosten Sie die .debDateien für den direkten Download und die Installation. Keine aptoder automatische Updates erforderlich.

Was , wie Ihre PyPI Abhängigkeiten (! Und Ihre Python Software auch) zu verpacken, gibt es eine Reihe von Tools und Referenzen, die den Prozess einfach zu machen:

  • stdeb , wie du schon sagtest . Oldie und Goodie.

  • Pybuild , ein neues, erstaunliches Tool von Debian, das ersetzt stdeb.

Und viele nützliche Hinweise:

Brauche Hilfe? Schauen Sie sich diese an:

MestreLion
quelle
2

Ich denke, Sie müssen nur den entsprechenden Befehlszeilencode zum postinst-Skript im .deb-Paket hinzufügen. In dieser Antwort finden Sie weitere Details im offiziellen Debian-Handbuch .

TheSchwa
quelle
2

Es ist pypi2debnotwendig, ein Paket von pypi zu bekommen und es in ein Deb-Paket zu verwandeln.

LtWorf
quelle
0

Dies ist nicht der Fall, es ist wie bei cpan in Perl. Wenn Sie Repositorys haben, können Sie mit apt-get installieren. Wenn Sie nicht mit pip installieren, sollte der Unterschied darin bestehen, dass pip in / usr / local installiert wird.

Um mit pip zu installieren, können Sie Folgendes tun:

apt-get install python-pip 
pip install foopackage 

beispielsweise:

pip install MultipartPostHandler2
Sérgio
quelle
Dies beantwortet nicht die Frage des OP. Die Frage ist, wie ein Debian-Paket ein Python-Paket von PyPi installieren soll, damit ein 'apt-get <benutzerdefiniertes Paket>' oder 'dpkg -i <benutzerdefiniertes Paket>' Python-Abhängigkeiten von PyPi ziehen kann.
SevakPrime
Sie tun dies nicht, ist wie cpan in Perl. Wenn Sie Repositorys haben, können Sie mit apt-get installieren. Wenn Sie nicht mit pip installieren, sollte der Unterschied darin bestehen, dass pip in / usr / local installiert wird, aber vielleicht wird dies der Fall sein am besten lösche meine antwort.
Sérgio
Ihr Kommentar gibt eine angemessene Antwort auf die Frage des OP. Sie sollten diesen Kommentar in Ihre Antwort aufnehmen, damit über ihn abgestimmt wird. (Siehe beispielsweise die Antwort von MestreLion.) Ihre Antwort beantwortet die Frage des OP nicht.
SevakPrime