Ich versuche, meinen Code an einen Remote-Server zu senden, auf dem möglicherweise eine andere Python-Version installiert ist und / oder auf dem für meine App möglicherweise keine Pakete erforderlich sind.
Um eine solche Portabilität zu erreichen, muss ich jetzt eine verschiebbare virtuelle Umgebung mit Interpreter und Code erstellen. Dieser Ansatz weist einige Probleme auf (z. B. müssen Sie eine Reihe von Bibliotheken manuell in Ihre virtuelle Umgebung kopieren, da --always-copy
dies nicht wie erwartet funktioniert) und ist im Allgemeinen langsam.
Es gibt (theoretisch) eine Möglichkeit , Python selbst statisch zu erstellen.
Ich frage mich, ob ich den Interpreter mit meinem Code in eine Binärdatei packen und meine Anwendung als Modul ausführen könnte. So etwas: ./mypython -m myapp run
oder ./mypython -m gunicorn -c ./gunicorn.conf myapp.wsgi:application
.
Antworten:
Es gibt zwei Möglichkeiten, wie Sie Ihr Problem lösen können
pyinstaller
oderpy2exe
cython
Ich werde erklären, wie Sie dies mit der zweiten Methode tun können, da die erste Methode nicht plattform- und versionübergreifend ist und in anderen Antworten erläutert wurde. Die Verwendung von Programmen wie pyinstaller führt normalerweise zu großen Dateigrößen, während die Verwendung von cython zu einer Datei mit einer KB-Größe führt
Installieren Sie zuerst
cython
. Benennen Sie dann Ihre Python-Datei (z. B.test.py
) in eine.pyx
Datei umAnschließend können Sie es
cython
zusammen mit GCC kompilieren (cython
generiert eine C-Datei aus einer Python-.pyx
Datei, und GCC kompiliert dann die C-Datei).(in Bezug auf https://stackoverflow.com/a/22040484/5714445 )
cython test.pyx --embed gcc -Os -I /usr/include/python3.5m -o test test.c -lpython3.5m -lpthread -lm -lutil -ldl
HINWEIS : Abhängig von Ihrer Python-Version müssen Sie möglicherweise den letzten Befehl ändern. Um zu wissen, welche Python-Version Sie verwenden, verwenden Sie einfach
Sie haben jetzt eine Binärdatei 'test', nach der Sie suchen
Andere Dinge zu beachten :
opencv
z. B.), müssen Sie ihnen möglicherweise das Verzeichnis mithilfe von bereitstellen-L
und dann den Namen der Bibliothek-l
in den GCC-Flags angeben . Weitere Informationen hierzu finden Sie unter GCC-Flagsquelle
cythonize -i file_0.py [...] file_n.py
für alle Ihre Python-Module und danncython main_file.py --embed
für Ihr Hauptskript. Am Ende erhalten Sie eine ausführbare Datei und .so-Dateien (.dll, .dylib, abhängig von Ihrem Betriebssystem), die Sie zusammen als eigenständige Lösung verwenden können.Vielleicht möchten Sie Nuitka untersuchen . Es nimmt Python-Quellcode und konvertiert ihn in C ++ - API-Aufrufe. Dann wird es in eine ausführbare Binärdatei (ELF unter Linux) kompiliert. Es gibt es schon seit einigen Jahren und es unterstützt eine Vielzahl von Python-Versionen.
Sie werden wahrscheinlich auch eine Leistungsverbesserung erhalten, wenn Sie es verwenden. Empfohlen.
quelle
Sie suchen wahrscheinlich nach etwas wie Freeze, das Ihre Python-Anwendung mit all ihren Bibliotheken in eine statische Binärdatei kompilieren kann:
PyPi-Seite von Freeze
Python Wiki Seite von Freeze
Sourceforge-Seite von Freeze
quelle
Einfrieroptionen:
Ihr Zielserver sollte jedoch über die gewünschte Umgebung verfügen -> Sie sollten in der Lage sein, diese zu erstellen. Wenn dies nicht der Fall ist, sollten Sie Ihre Software so erstellen, dass sie der Umgebung entspricht.
Ich habe diese praktische Anleitung zum Installieren einer benutzerdefinierten Version von Python auf einer virtuellen Umgebung gefunden, vorausgesetzt, Sie haben SSH-Zugriff: https://stackoverflow.com/a/5507373/5616110
In virtualenv sollten Sie in der Lage sein, alles zu installieren, und Sie sollten sich keine Gedanken über Sudo-Berechtigungen machen müssen. Natürlich macht es alles viel einfacher, diese zu haben und auf Paketmanager wie apt zuzugreifen.
quelle
Wenn Sie einen Mac verwenden, können Sie mit py2app ein .app-Bundle erstellen, mit dem Ihre Django-App gestartet wird, wenn Sie darauf doppelklicken.
Ich habe unter https://moosystems.com/articles/14-distribute-django-app-as-native-desktop-app-01.html beschrieben, wie Django und CherryPy zu einem solchen Bundle gebündelt werden
In dem Artikel verwende ich pywebview, um Ihre Django-Site in einem lokalen Anwendungsfenster anzuzeigen.
quelle