Wie kann ich Python-Programme verteilen?

102

Meine Bewerbung sieht folgendermaßen aus:

main.py.
Windows /
    __init__.py
    mainwindow.py
    ...
Modell/
    __init__.py
    orders.py
    ...
Ressourcen/
    image1.png
    logo.jpg
    ...

Das Programm wird mit main.py gestartet. Gibt es eine gute Möglichkeit, daraus eine "endgültige" Anwendung zu erstellen? Ich denke an etwas wie py2exe / py2app, aber ohne den Python-Interpreter / die Python-Module in die Anwendung zu kopieren, in der nur eine ausführbare Datei vorhanden ist.

Ich habe mir distutils angesehen, aber es sieht so aus, als würde ein Programm im Python-Verzeichnis installiert, was auf Nicht-Linux-Plattformen nicht üblich ist.

Im Moment kopiere ich einfach den gesamten Quellordner auf den Zielcomputer und erstelle einen Alias ​​für main.pywWindows. Einige Unannehmlichkeiten:

  • Das Symbol ist das Standard-Python-Symbol.
  • Ich muss den Alias ​​manuell erstellen.
  • In meinem Quellverzeichnis befinden sich viele zusätzliche Dateien wie der Quellcodeverwaltungsordner.
  • Ich muss umbenannt werden, main.pyum main.pywmanuell.
  • Es wäre schön, wenn sich nur `.pyo * -Dateien auf dem Zielcomputer befinden würden. Es gibt keinen wirklichen Grund dafür, ich mag es einfach nicht, unnötige Dateien zu haben.

Wie schafft man eine schöne automatisierte Distribution?

  • für Windows? (Das ist die einzige Plattform, die ich momentan unterstützen muss.)
  • für Mac?
  • für Linux?
Georg Schölly
quelle
2
"Ich habe mir distutils angesehen, aber es sieht so aus, als würde ein Programm im Python-Verzeichnis installiert, was auf Nicht-Linux-Plattformen nicht üblich ist." Warum sagen Sie das? Welchen Text hast du gelesen, der das gesagt hat? Es ist sicherlich falsch, woher hast du diesen Eindruck?
S.Lott

Antworten:

37

Die normale Art, Python-Anwendungen zu verteilen, ist distutils . Es wurde sowohl für die Verteilung von Python-Modulen vom Bibliothekstyp als auch für Python-Anwendungen entwickelt, obwohl ich nicht weiß, wie es unter Windows funktioniert. Unter Windows müssten Sie Python auf jeden Fall separat installieren, wenn Sie distutils verwenden.

Ich würde wahrscheinlich empfehlen, dass Sie es mit Disutils für Linux und Py2exe oder ähnlichem für Windows verteilen. Für OS XI weiß ich nicht. Wenn es sich um eine Endbenutzeranwendung handelt, möchten Sie wahrscheinlich eine Art Disk-Image. Ich weiß nicht, wie das geht. Lesen Sie diesen Beitrag, um weitere Informationen zur Benutzererfahrung zu erhalten. Für eine Anwendung, die für Programmierer erstellt wurde, ist eine Installation unter distutils wahrscheinlich auch unter OS X in Ordnung.

Lennart Regebro
quelle
1
Mac und Linux sind im Moment nicht so wichtig. Py2app erstellt .app-Bundles. Und ich denke, dass der Versand von Mac-Apps in .dmg veraltet ist, sollte man .zip verwenden. Ist es möglich, mit distutils einfach ein Verzeichnis zu erstellen distund alle relevanten Dateien in dieses zu kopieren?
Georg Schölly
1
@gs: Der Befehl sdist erstellt eine TAR-Datei aller Quelldateien.
Martin v. Löwis
5
@gs: Der Versand von Mac-Apps in .dmg ist eigentlich sehr verbreitet. .dmg's sind Disk-Images und kein Format für Anwendungen (das wäre .app). Daher finden Sie häufig eine einzelne .app in einer .dmg zusammen mit einer README-Datei.
Eric O Lebigot
2
@gs Ich weiß nicht, warum Sie möchten, dass distutils einfach ein Verzeichnis dist erstellt und die Dateien dort kopiert. Sie können dies selbst tun. Distutils erledigt viele Dinge, einschließlich der Erstellung von Windows-Installationsprogrammen, und erstellt aus Python 2.6 auch Links im Startmenü. Sie müssen Python jedoch separat installieren. Für eine Endbenutzer-App ist py2exe meiner Meinung nach eine bessere Lösung, da es eigenes Python enthält. Versand / Installer für OS X werden von Alexander Limi in seinem Bloggpost ausführlich besprochen, daher schiebe ich ihn zurück.
Lennart Regebro
61

Ich kann Pyinstaller nur empfehlen , das alle wichtigen Plattformen nahtlos unterstützt. Wie py2exe und py2app erstellt es unter Windows eine ausführbare Standarddatei und unter OS X ein App-Bundle, hat jedoch den Vorteil, dass auch häufig auftretende Abhängigkeiten automatisch aufgelöst und ohne zusätzliche Konfigurationsänderungen eingeschlossen werden.

Beachten Sie außerdem, dass Sie diesen Patch auf Pyinstaller-Trunk anwenden sollten, wenn Sie Python 2.6 unter Windows bereitstellen.

Sie haben angegeben, dass Sie kein Installationsprogramm benötigen, aber Inno Setup ist eine einfach zu verwendende und schnell einzurichtende Option für die Windows-Plattform.

Daniel Naab
quelle
3
Ich bin mir nicht sicher, ob es übertrieben ist. Das Bündeln einer App mit Pyinstaller kann tatsächlich einfacher sein als andere Methoden, insbesondere solche mit Abhängigkeiten von c-Erweiterungen ... in den meisten Fällen so einfach wie ein einzeiliger Befehlszeilenaufruf. Die Installation von Python + Abhängigkeiten + der App selbst (ob über Distutils usw. oder nur über eine Zip-Datei) ist aufwändiger, insbesondere wenn der Entwickler den Zielcomputer nicht manuell konfigurieren kann und dem Client Anweisungen geben muss. Zumindest unter Windows halte ich diesen Verteilungsstil für sinnvoll.
Daniel Naab
1
Ein wenig unpraktisch mit pyinstaller: Wenn Sie die mit pyinstaller erstellte ausführbare Datei verwenden, dauert der Beginn der Ausführung einige Sekunden.
JuanPablo
1
Genau das, wonach ich gesucht habe. Ich muss manchmal meine Skripte auf Computern laufen lassen, auf denen ich nichts installieren kann. Eine einzelne ausführbare Datei ohne externe Abhängigkeiten ist das, was ich brauche. Ich kann ein paar Sekunden für den Start sparen. Danke dir!
CodeMonkey
Nicht für kleine Anwendungen empfohlen, da ein einfaches Hello worldProgramm 500 MB Speicherplatz und eine Initialisierungszeit von 3-5 Sekunden benötigt.
Raf
Sie können diesen Speicherplatz vermeiden, indem Sie Ihre Anwendung in einer separaten Umgebung verteilen (z. B. mit venv oder pyenv)
Alexander Santos,
4

Fredrik Lundhs squeeze.pykann eine einzelne Datei erstellen, die nicht den Python-Interpreter enthält, sondern Bytecode. Mit den richtigen Argumenten können Sie andere Dateien, Module usw. in die Ergebnisdatei aufnehmen. Ich habe es erfolgreich in einem Projekt verwendet. Das resultierende Programm lief problemlos unter OS X, Linux und Windows!

PS : Jeder Computer benötigt einen Python-Interpreter, der mit dem von Squeeze.py generierten Bytecode kompatibel ist. Sie können bei Bedarf verschiedene Bytecode-Versionen für verschiedene Versionen von Python generieren (führen Sie einfach squeeze.py mit der richtigen Version von Python aus).

Eric O Lebigot
quelle
4

Ich denke, es ist auch erwähnenswert, PEX zu erwähnen (wenn man mehr die Aufmerksamkeit berücksichtigt, die diese Frage erhalten hat, und weniger die Frage selbst). Nach eigener Beschreibung :

PEX-Dateien sind eigenständige ausführbare virtuelle Python-Umgebungen. Insbesondere handelt es sich um sorgfältig erstellte Zip-Dateien mit einem #!/usr/bin/env pythonund einem speziellen __main__.py, mit dem Sie mit der PEX-Laufzeit interagieren können. Weitere Informationen zu Zip-Anwendungen finden Sie in PEP 441 .

Ich bin darauf gestoßen, als ich eine Übersicht über die Verpackung von Python gelesen habe . Sie haben dieses schöne Bild dort gepostet: Geben Sie hier die Bildbeschreibung ein

Zusammenfassend: Wenn Sie es sich leisten können, sich auf die Installation von Python auf dem Zielcomputer zu verlassen, verwenden Sie PEX, um eine eigenständige »ausführbare Datei« zu erstellen, die wahrscheinlich eine geringere Dateigröße aufweist als beispielsweise eine von PyInstaller erstellte ausführbare Datei.

user3389669
quelle
1

Wenn Sie unter Windows verteilen, installieren Sie mit einem Installationsprogramm alle relevanten Dateien / Interpeter, die benötigt werden. Verteilen Sie eine setup.exe. Das ist der beste Weg unter Windows. Andernfalls werden sich Benutzer beschweren.

Byron Whitlock
quelle
1
Ich brauche kein Installationsprogramm, da nur ein Benutzer das Programm verwenden wird. Aber natürlich, wenn Sie ein Programm für mehr Benutzer schreiben, das unter Windows ein Muss ist.
Georg Schölly
1
@gs: Oh, nur ein Benutzer. Gut, dann würde ich empfehlen, ein grundlegendes distutils-Paket zu erstellen, entweder eine Quelldistribution oder ein Windows-Binärinstallationsprogramm. Das ist definitiv eine einfache und nette Möglichkeit, ein Python-Modul zu verteilen.
Lennart Regebro
0

Die bequemste * plattformübergreifende Methode zum Verteilen von Python-Desktopanwendungen besteht darin, sich auf den plattformübergreifenden Conda-Paketmanager zu verlassen. Es gibt verschiedene Tools, die es verwenden:

  • Miniconda-Install - Powershell / Bash-Skripte, die Miniconda automatisch herunterladen und eine isolierte Conda-Umgebung für die App erstellen. Unterstützt Pip, scheint jedoch nicht gewartet zu werden und hat Probleme beim Herunterladen von https.
  • Anaconda Project und (Conda) Konstruktor von Continuum. Beide benutzen Conda. (conda) -Konstruktor scheint in der Lage zu sein, eigenständige Installationsprogramme und sogar NSIS-Installationsprogramme unter Windows zu erstellen, unterstützt jedoch pip nicht. Scheint sich wie Anaconda / Miniconda-Installateure zu verhalten.
  • PyAppShare - Der Endbenutzer installiert zuerst Miniconda / Anaconda (wie eine Laufzeitumgebung). Dann erstellt ein einzelnes Batch- / Bash-Installationsskript eine isolierte Conda-Umgebung aus der Yaml-Spezifikation. Die Anwendung ist auch ein Conda / Pip-Paket selbst, das in der Umgebung installiert und ein ausführbarer Einstiegspunkt erstellt wird. Plattformübergreifende Desktop- und Programmverknüpfungen werden automatisch erstellt. Sie aktivieren die Umgebung und starten die Anwendung. Unterstützt pip.

* Am bequemsten für den Entwickler. Genug praktisch für den Endbenutzer.

Peter Zagubisalo
quelle