So verpacken Sie Python-Apps mit BeeWare Briefcase

Python ist in einigen Bereichen nicht ausreichend. Zum Beispiel ist Python nicht die schnellste Sprache, aber Bibliotheken von Drittanbietern wie NumPy ermöglichen es Ihnen, dies zu umgehen. Wo Python am mangelhaftesten ist, ist die Verpackung. Das heißt, Python fehlt ein konsistenter interner Mechanismus zum Generieren einer eigenständigen Binärdatei aus einer Anwendung. Geh und Rust macht das. Warum kann Python nicht?

Es kommt hauptsächlich darauf an, dass Python bis vor relativ kurzer Zeit in seiner Geschichte keine Kultur solcher Anwendungsfälle hat. Daher wurden erst vor relativ kurzer Zeit Module von Drittanbietern angezeigt, mit denen Python-Apps als eigenständige Binärdateien gepackt werden können. PyInstaller - das ich zuvor behandelt habe - ist eine solche App. In diesem Artikel sehen wir uns ein noch eleganteres und leistungsfähigeres Dienstprogramm für die Python-App-Verpackung an, BeeWare's Briefcase.

[Ebenfalls auf: Python virtualenv und venv do's and don'ts]

Es gibt jedoch zwei Vorbehalte, die es wert sind, auf Aktenkoffer hingewiesen zu werden. Erstens führt Aktenkoffer keine plattformübergreifenden Verpackungen durch. Sie müssen auf der Plattform aufbauen, für die Sie bereitstellen. Zweitens funktioniert Briefcase am besten mit Apps, die ein GUI-Toolkit verwenden. Wir werden im Folgenden auf diese Probleme näher eingehen.

Was ist BeeWare Aktentasche?

Aktentasche ist Teil einer allgemeinen Reihe von Tools von BeeWare zum Erstellen von Apps, wobei sich die verschiedenen Teile ergänzen. Mit Kivy von BeeWare können Sie beispielsweise plattformübergreifende GUI-Apps in Python erstellen, die nicht nur auf allen wichtigen Betriebssystemplattformen, sondern auch im Web ausgeführt werden. Aber hier konzentrieren wir uns auf Aktentaschen, die mit oder ohne die anderen Werkzeuge verwendet werden können.

Aktenkoffer packt Apps für alle unterstützten Betriebssysteme in einem gemeinsamen Format für Apps auf dieser Plattform:

  • Microsoft Windows (MSI-Installationsprogramm)
  • macOS ( .app Formatdatei)
  • Linux (AppImage)
  • iOS (Xcode-Projekt)
  • Android (Gradle-Projekt)

Für die Bereitstellung unter iOS oder Android benötigen Sie die Entwicklungskits für diese Plattformen.

Eine Sache, die Briefcase  nicht  unterstützt, ist die plattformübergreifende Bereitstellung. Wenn Sie beispielsweise Windows verwenden, können Sie keine macOS-App erstellen. Dazu benötigen Sie macOS. Andere App-Bundler für Python sind ähnlich eingeschränkt, sodass diese Einschränkung keineswegs nur für Aktenkoffer gilt.

Aktentasche ist auch kein „Compiler“ - sie wandelt Python-Programme nicht in ihre nativen Maschinencode-Entsprechungen um. Ihre Apps werden bei der Bereitstellung als Aktenkoffer-Apps nicht schneller ausgeführt als normalerweise.

Einrichtung des Aktenkofferprojekts

Für den Aktenkoffer müssen Sie ein dediziertes Projektverzeichnis mit einer eigenen virtuellen Umgebung einrichten. Wenn Sie mit „venvs“, wie virtuelle Python-Umgebungen genannt werden, noch nicht vertraut sind, lohnt es sich, sich mit ihnen vertraut zu machen, da sich die Python-Entwicklung auf dem neuesten Stand der Technik stark um sie dreht.

Nachdem Sie ein venv eingerichtet pip install briefcase haben, verwenden Sie die Befehlszeilentools von Briefcase, um Projekte in Aktenkoffer- Paketen  einzurichten, zu verwalten und bereitzustellen. Dies ähnelt der Funktionsweise von Tools wie Poetry: Die meisten Interaktionen auf hoher Ebene mit dem Projekt erfolgen über das Tool, sodass Sie keine Dateien manuell erstellen oder Konfigurationen bearbeiten müssen.

Um ein neues Aktenkofferprojekt zu starten, öffnen Sie die CLI in Ihrem Projektverzeichnis, aktivieren Sie die virtuelle Umgebung (vorausgesetzt, Sie verwenden nicht automatisch die CLI einer IDE, um dies automatisch zu tun) und geben Sie ein  briefcase new. Dadurch wird in Ihrem Projektverzeichnis ein Gerüst für ein Aktenkofferprojekt erstellt.

Sie müssen zunächst einige Fragen zum Projekt beantworten, und für die meisten können Sie einfach drücken  Enter , um die Standardeinstellung zu übernehmen. Aber eine der Fragen, die Ihnen gestellt werden - die letzte - ist von großer Bedeutung: die Wahl des zu verwendenden GUI-Frameworks.

Eines der anderen Angebote von BeeWare ist das UI-Toolkit Toga zum Erstellen von GUIs in Python-Programmen mit plattformeigenen UI-Komponenten. Wenn Sie Toga lernen möchten, während Sie gleichzeitig mit Aktenkoffer arbeiten, hindert Sie nichts daran. Sie können auch "Keine" auswählen und eine "kopflose" App erstellen, die über die Befehlszeile ausgeführt wird, oder Sie können ein UI-Toolkit oder ein Fenstersystem eines Drittanbieters wie Pyglet oder PyQT verwenden.

Beachten Sie, dass die App, wenn Sie kein UI-Toolkit installieren, keinerlei Konsoleninteraktivität aufweist, dh kein Konsolenfenster öffnet und nichts auf die Konsole druckt. Dies ist nützlich, wenn Sie ein Programm bereitstellen, für das keine Konsoleninteraktion erforderlich ist, z. B. wenn es als lokaler Webserver ausgeführt wird und einen Webbrowser für die Interaktion verwendet. Es gibt jedoch noch keine Möglichkeit, Aktenkofferprogramme ohne installiertes UI-Paket mit einer Konsole auszuführen.

Projektstruktur der Aktentasche

In einem frisch initiierten Aktenkoffer-App-Verzeichnis sind mehrere Dateien vorinstalliert:

  • Die oberste Ebene des App-Verzeichnisses enthält die Lizenz, die pyproject.toml Datei des Projekts  , eine README-Beispieldatei im ReStructured Text-Format und eine .gitignore Datei, die mit allgemeinen Verzeichnissen vorab angepasst wurde, um sie aus jedem für das Projekt erstellten Git-Repository zu entfernen  .
  • Das  src Verzeichnis enthält den Quellcode Ihrer App mit zwei Unterverzeichnissen: eines, das die App enthält (es hat den gleichen Namen wie Ihr Projektverzeichnis), und eines, das die Metadaten der App enthält.
  • Das App-Verzeichnis enthält ein  resources Verzeichnis, in dem Ressourcen wie Anwendungssymbole gespeichert werden.

Aktenkoffer-Projektbefehle

Mit diesem  briefcase Befehl führen Sie die meisten Interaktionen mit einem Aktenkofferprojekt durch. Wir haben den  new obigen Befehl behandelt, mit dem ein Aktenkofferprojekt in einem bestimmten Ordner eingerichtet wird. In der Regel müssen Sie jedoch während des Lebenszyklus einer Aktenkoffer-App viele andere Befehle verwenden, von denen einige möglicherweise nicht intuitiv sind.

Hier sind die häufigsten Aktenkofferbefehle, die Sie verwenden werden:

  • dev: Wenn Sie sich in einem App-Verzeichnis befinden, führt dieser Befehl diese App im  Entwicklungsmodus aus . Im Entwicklungsmodus können Sie die Anwendung mit allen installierten Bibliotheken ausführen, ohne dass sie für die Bereitstellung formal verpackt werden muss. Wenn Sie Ihre Anwendung entwickeln, werden Sie sie meistens im Entwicklungsmodus testen. Wenn sich Abhängigkeiten seit Ihrer letzten Ausführung geändert haben   , aktualisieren Sie sie devmit dem  -dFlag.
  • build: Erstellt eine Kopie der Anwendung in der Form, die zum Packen für die Verteilung erforderlich ist. Dies unterscheidet sich davon,  dev dass Sie für verschiedene Plattformen bauen können, wenn das Gerüst installiert ist.
  • update: Aktualisiert einen Anwendungsbuild. Auf diese Weise können Sie schnell sicherstellen, dass der Build Ihrer Anwendung den neuesten Code enthält, anstatt ihn zu verwenden build, wodurch viel mehr Dateien neu generiert  werden. Übergeben Sie das  -d Flag zum Aktualisieren von Abhängigkeiten und das  -rFlag zum Aktualisieren von Ressourcen (dh zum Kopieren von Ressourcen aus der Entwicklungsversion Ihrer App in die Build-Version).
  • run: Führt die erstellte Version der App aus. Dies simuliert im Wesentlichen das Ausführen der gepackten und bereitgestellten Version der Anwendung. Übergeben Sie das  -u Flag, um den Code vor dem Ausführen zu aktualisieren.
  • package: Erstellt ein Anwendungsinstallationspaket aus der erstellten Version der App. Das Endergebnis ist ein Artefakt, das Sie anderen zur Installation Ihres Programms geben können - z. B. eine .MSI unter Windows.

Hier sind einige der weniger häufig verwendeten Aktenkofferbefehle: 

  • create: Nicht zu verwechseln  newcreate erstellt das Gerüst für ein Anwendungsinstallationsprogramm - eine Möglichkeit, das Installationsprogramm der Anwendung für eine bestimmte Plattform zu erstellen. Wenn Sie eine App mit einrichten  new, wird diese mit einem Gerüst für die Plattform geliefert, an der Sie arbeiten. create Mit dieser Option können Sie bei Bedarf Gerüste für eine andere Plattform hinzufügen. 
  • upgrade: Aktualisiert die zum Packen der App verwendeten Komponenten, z. B. das Wix-Framework.
  • publish: Veröffentlicht die gepackte App in einem Veröffentlichungskanal wie einem App Store. (Zum jetzigen Zeitpunkt funktioniert diese Funktion noch nicht.)

Zusammenfassend ist dies die Reihenfolge, in der Sie die Aktenkofferbefehle im typischen App-Lebenszyklus verwenden würden:

  • new um die App zu erstellen
  • dev um die App auszuführen, während Sie daran arbeiten
  • build um eine Version der App zu erstellen, die für die Verteilung gepackt werden soll
  • run um die gepackte Version der App zu testen
  • update um die gepackte Version der App mit Codeänderungen auf dem neuesten Stand zu halten
  • package um die gepackte Version der App mit einem Installationsprogramm bereitzustellen

Erstellung einer Aktenkoffer-App

Das Erstellen eines Python-Programms als Aktenkoffer-App entspricht weitgehend dem Erstellen einer anderen Python-App. Die Hauptprobleme betreffen die Projektstruktur. Der Einstiegspunkt __main__.py der App befindet sich  im App-Verzeichnis, das  app.py aus demselben Verzeichnis geladen und ausgeführt wird  main(). Wenn Sie ein Projekt initialisieren, wird es mit Platzhalterversionen einiger Projektdateien gefüllt, die Sie nach Bedarf erstellen oder ersetzen können.

Wenn Sie ein vorhandenes  Projekt in Aktenkoffer umwandeln  , stellen Sie sicher, dass Sie es so strukturieren, dass der Einstiegspunkt den Erwartungen von Aktenkoffer entspricht. Wenn Sie den Code beispielsweise nicht in einem src Verzeichnis gespeichert haben  , müssen Sie Ihren Code in  src seine Pfade und Verzeichnisstrukturen verschieben und etwaige Inkompatibilitäten beheben.

Die andere Sache, die Sie beachten sollten, ist der Umgang mit Abhängigkeiten von Drittanbietern. Die  pyproject.toml Datei in Ihrem Projektverzeichnis steuert, welche Abhängigkeiten dem Projekt hinzugefügt werden sollen. Wenn Ihr Projekt benannt ist  myprojectpyproject.toml enthält es einen Abschnitt  [tool.briefcase.app.myproject]mit einer  requires Zeile, in der jede Anforderung so aufgelistet ist, wie sie in einer  requirements.txt Datei angegeben wird. Wenn Ihr Projekt zum Beispiel  regex und benötigt  black, würden Sie diese Zeile auf setzen  requires = ["regex","black"]. Sie werden dann verwenden  briefcase dev -d , um die Abhängigkeiten für die Entwicklungsversion des Projekts briefcase update -d zu aktualisieren und  um Abhängigkeiten in der Paketversion zu aktualisieren.

Verpackung und Lieferung der Aktenkoffer-App

Nach dem Ausführen  briefcase packagewird in einem Unterverzeichnis des Projektverzeichnisses eine für Ihr Programm weiterverteilbare Datei angezeigt, die der Plattform entspricht, für die Sie erstellt haben. Unter Microsoft Windows lautet das Verzeichnis beispielsweise  windows, und die weitervertreibbare .msi Datei ist eine  Datei mit demselben Namen wie Ihr Projekt. Für Android und iOS sind die Ergebnisse Projekte für Gradle bzw. Xcode. Diese müssen mit diesen Tools kompiliert werden, damit sie auf diesen Plattformen bereitgestellt werden können.

Wie man mehr mit Python macht

  • Wie man Anaconda neben anderen Pythons laufen lässt
  • Verwendung von Python-Datenklassen
  • Beginnen Sie mit Async in Python
  • So verwenden Sie Asyncio in Python
  • 3 Schritte zu einer asynchronen Python-Überholung
  • Verwendung von PyInstaller zum Erstellen von ausführbaren Python-Dateien
  • Cython-Tutorial: So beschleunigen Sie Python
  • So installieren Sie Python auf intelligente Weise
  • So verwalten Sie Python-Projekte mit Poetry
  • So verwalten Sie Python-Projekte mit Pipenv
  • Virtualenv und venv: Erklärte virtuelle Python-Umgebungen
  • Python virtualenv und venv tun und nicht tun
  • Python-Threading und Unterprozesse erklärt
  • Verwendung des Python-Debuggers
  • Verwendung von timeit zum Profilieren von Python-Code
  • Verwendung von cProfile zum Profilieren von Python-Code
  • So konvertieren Sie Python in JavaScript (und wieder zurück)