Packen Sie eine Python-Anwendung mit ihren Abhängigkeiten
Webagentur » Digitale Nachrichten » Packen Sie eine Python-Anwendung mit ihren Abhängigkeiten

Packen Sie eine Python-Anwendung mit ihren Abhängigkeiten

Vor einiger Zeit habe ich eine Anwendung in Python entwickelt. Um den Kontext festzulegen, ging es darum, eine ausführbare Datei zu erstellen, die in der Lage ist, a bereitzustellen docker-compose.yml durch die Anwendung von Geschäftsregeln. Um nicht alles neu zu schreiben, habe ich ein Projekt in erstellt Python Bibliothek nutzen zu können Docker-komponieren das ist auch in Python. Einmal funktionsfähig, musste meine Anwendung in einer einzigen Datei erstellt werden. Mein Ziel war es Generieren Sie eine Binärdatei mit allen Abhängigkeiten (ein bisschen wie Golang).

Aufmerksamkeit ! Das Generieren einer Binärdatei befreit Sie nicht von der Installation von Python auf Ihrem Computer. Die Binärdatei ist keine kompilierte Anwendung, sondern nur ein Paket.

Architektur

Zuerst erstellen Sie einen Ordner foobar in Ihrem Projekt. Darin sind alle Ihre Arbeiten enthalten.

1
2
3
4
5
6
Projekt
|_ __main__.py
|_ foobar
|_ __init__.py
|_ __main__.py
|_cli.py

Wenn Sie auf diesen Artikel gestoßen sind, liegt das daran, dass Sie Python mindestens so gut kennen wie ich und daher wissen, wie man Abhängigkeiten global oder in einem installiert virtualenv.

Persönlich führe ich meine Entwicklungen in a Docker-Container Also installiere ich meine Abhängigkeiten als Globals.

So installieren Sie eine Abhängigkeit.

1
$ pip install docopt

Dann können Sie an Ihrer Datei arbeiten clip.py. Hier ist ein Beispiel mit der Verwendung der Bibliothek Arzt.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# project/foobar/cli.py
von Arzt importieren Arzt
freigeben = 1.0.0
Hilfe= « » »Foobar
Verwendung:
foobar-Version
Zubehör:
-h --help Hilfe anzeigen
Foobar ist ein gefälschtes Open-Source-Projekt, das von Baptiste Donaux entwickelt wurde.
"" "
def Haupt-():
argumente = docopt(hilfe)
if Argumente[" Ausführung "]:
drucken(„Foobar-Version“, Ausführung)

Eine Datei zum Starten der Entwicklungsanwendung wird benötigt (in meinem Fall __init__.py ist eine leere, aber erforderliche Datei).

1
2
3
4
5
6
# project/foobar/__main__.py
von . importieren cli
if __name__ == " __Hand__ ":
CLI.main()

Um ein Binärpaket zu erstellen, benötigen Sie einen Einstiegspunkt (project/__main__.py).

1
2
3
4
5
6
# project/__main__.py
von foobar importieren cli
if __name__ == " __Hand__ ":
CLI.main()

Jetzt können Sie Ihre Anwendung einfach ausführen.

1
2
$ python ./foobar/version
('Foobar-Version', '1.0.0')

Erstellen Sie eine statische Binärdatei

Arbeitsablauf

Von einem sauberen Projekt (ohne Abhängigkeit…) sind hier die Schritte, die ausgeführt werden.

  • So erstellen Sie eine virtualenv und aktiviere es
  • Abhängigkeiten installieren und beenden virtualenv
  • Löschen Sie Dateien und Ordner, die im vorhanden sind virtualenv/lib/python2.7/sites-packages, die einem Ordner entsprechen Pip, ein Cache-Ordner, zu kompilierten Dateien oder Informationsdateien.
  • Erstellen Sie einen Ordner, um die endgültige Datei zu erstellen
  • Kopieren Sie Abhängigkeiten, Quellen und Eingabedatei in den neu erstellten Ordner.
  • Erstellen Sie einen komprimierten Ordner (.zip) des Inhalts des Build-Ordners.
  • Erstellen Sie die „binäre“ Datei mit einem Header, um die Umgebung anzugeben, und hängen Sie an diese Datei den Inhalt des komprimierten Ordners an.

Hardcore

Hier sind die technischen Schritte, die zu befolgen sind.

1
2
3
4
5
6
7
8
9
10
11
12
$ virtualenv-Abhängigkeiten
$. ./dependencies/bin/activate
$ pip install docopt
$ deaktivieren
$ rm -rf $(find ./dependencies/lib/python2.7/site-packages -print | egrep '(/pip/)|(__pycache__)|(.(pyc|dist-info|so)$)')
$ mkdir-Build
$ cp -R ./dependencies/lib/python2.7/site-packages/*./foobar./__main__.py./build/
$ cd ./bauen
$ zip -r ../release.zip *
$ Echo '#!/usr/bin/env python' > ../freigeben
$ cat ../release.zip >> ../release
$chmod +x../release

Konklusion

Jetzt können Sie Ihre Binärdatei ganz einfach ausführen. Es bettet seinen gesamten Kontext ein.

1
2
$ ./Release-Version
('Foobar-Version', '1.0.0')

Diese Lösung war für mich sehr praktisch, um eine Anwendung mit einer einzigen Datei bereitzustellen. Sie können das Beispieldateiarchiv herunterladen, um meine Demonstration zu reproduzieren.

★ ★ ★ ★ ★