Wie kann man ein Python-Skript eigenständig ausführbar machen, damit es ohne Abhängigkeit ausgeführt werden kann?

706

Ich erstelle eine Python-Anwendung und möchte meine Clients nicht zwingen, Python und Module zu installieren.

Gibt es also eine Möglichkeit, ein Python-Skript als eigenständige ausführbare Datei zu kompilieren?

Jeff
quelle
307
Der Teil der Frage, der besagt: "Ich möchte meine Clients nicht zwingen, Python und Module zu installieren." Es heißt nicht, dass die Clients dies nicht können, sondern dass der Entwickler nicht möchte, dass sie dies tun. Es macht keinen Sinn, hier darüber zu diskutieren, weil die Kunden nicht SO lesen, um für sich selbst zu sprechen. Ich möchte keine Flash-Entwicklungsumgebung installieren, um nur YouTube anzusehen, oder eine C-Entwicklungsumgebung, um nur Sudoku zu spielen, oder eine Python-Entwicklungsumgebung, um eine in Python geschriebene Version von Angry Birds auszuführen. Dafür sind umverteilbare Laufzeiten gedacht.
Dave

Antworten:

243

Sie können mit py2exe wie bereits und Nutzung beantwortet cython Ihren Schlüssel konvertieren .pyDateien in .pyc, C kompilierten Dateien, wie .dllin Windows und .sounter Linux, viel härter als üblich zurückzukehren .pyound .pycDateien (und auch Performance - Gewinn!)

Neurino
quelle
1
Danke für die Antwort. Ich habe über Cython nachgedacht, aber es scheint, dass Python noch benötigt wird, um eine kompilierte ausführbare Datei auszuführen. Meinen Sie damit, ein Skript mit Cython nach .pyc zu kompilieren? (Ich wusste nicht, ob Cython eine solche Funktion hat)
Jeff
9
Ich meine, Sie haben zwei Probleme : Closed Source und No-Deps. Für Closed Source kompilieren Sie Ihren wichtigen Code in C libs mit Cython. Verwenden Sie für No-Deps py2exe und erstellen Sie eine ausführbare Datei mit .pyd-Dateien (Cython-kompiliert).
Neurino
7
Was würden Sie mit den Bibliotheken tun (numpy, scipy, matplotlib)? Wie könnten Clients beispielsweise die Funktion ginput () in matplotlib aus der ausführbaren Datei verwenden, ohne sie auf ihrem Computer installiert zu haben?
Chimpsarehungry
@chimpsarehungry was ist mit statischer Verknüpfung?
Braden Best
11
Die letzte Veröffentlichung scheint im Jahr 2008 zu sein. Wird diese noch beibehalten?
Zitrax
302

Mit PyInstaller können Sie Python-Programme als eigenständige ausführbare Dateien verpacken. Es funktioniert unter Windows, Linux und Mac.

PyInstaller-Schnellstart

Installieren Sie PyInstaller von PyPI:

pip install pyinstaller

Gehen Sie in das Verzeichnis Ihres Programms und führen Sie Folgendes aus:

pyinstaller yourprogram.py

Dadurch wird das Bundle in einem aufgerufenen Unterverzeichnis generiert dist.

Eine ausführlichere Anleitung finden Sie im Handbuch .

Rumple Stiltskin
quelle
10
Es ist erwähnenswert, dass Pyinstaller zu einer einzigen EXE-Datei kompiliert werden kann. Auch auf welchem ​​Betriebssystem es ausgeführt wird, macht diese ausführbare Datei, dh .exe, wenn sie unter Windows ausgeführt wird
Richard de Wit
2
@ ItayMoav-Malimovka Sie arbeiten in der Unterstützung von Python 3. Siehe github.com/pyinstaller/pyinstaller/tree/python3 .
PhoneixS
3
Wie @GeenHenk sagte, wenn Sie unter Windows "kompilieren", wird eine Exe erstellt. Denken Sie daran, dass Sie unter Linux nicht für Windows kompilieren (eine Exe erstellen) oder eine Linux-Datei unter Windows ausführbar machen können. Sie können nur die ausführbare Datei der Plattform erstellen, die Sie ausführen. (Unter Linux können Sie Wein verwenden, um dies
auszutricksen
14
Die Verwendung von 'pyinstaller' ist viel einfacher als die Verwendung von 'py2exe'. Es kümmert sich um alle Abhängigkeiten, einschließlich Numpy, Pandas, alles und gibt Ihnen eine einzige ausführbare Datei auf der Arbeitsplattform!
Aks
12
Scheint genau das zu sein, wonach ich gesucht habe. Und unterstützt jetzt Python 3! Danke :)
Daniel Gruszczyk
83

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.

cdarke
quelle
5
Nuitka ist ein großartiges Werkzeug. Keine Notwendigkeit, es nicht zu benutzen. Ich möchte nur auf eines hinweisen - es ist nicht nur auf Linux beschränkt - es ist plattformübergreifend - ein weiterer Grund, warum es verwendet wird.
Sjaustirni
5
Nuitka funktioniert unter Python 2.6, 2.7, 3.2, 3.3 und 3.4 und ist plattformübergreifend: (Linux, FreeBSD, NetBSD, MacOS X und Windows (32/64 Bit). Andere funktionieren möglicherweise ebenfalls. Architekturen: x86, x86_64 (amd64) und arm. Andere Architekturen funktionieren möglicherweise auch sofort.)
Jonathan Hartley
Es wird für die neueste
Version
Funktioniert wie ein Zauber unter macOS High Sierra + Python 3.5.2. Vielen Dank!
Anthony L.
Erstellt dies eine eigenständige ausführbare Datei?
Stimmen
31

Ich möchte einige nützliche Informationen zum Erstellen von eigenständigen Dateien unter Windows mit Python 2.7 zusammenstellen.

Ich habe py2exe verwendet und es funktioniert, aber ich hatte einige Probleme.

Aus diesem letzten Grund habe ich PyInstaller http://www.pyinstaller.org/ ausprobiert .

Meiner Meinung nach ist es viel besser, weil:

  • Es ist einfacher zu bedienen.

Ich schlage vor, beispielsweise eine .bat-Datei mit den folgenden Zeilen zu erstellen (pyinstaller.exe muss sich im Windows-Pfad befinden):

pyinstaller.exe --onefile MyCode.py

Daher denke ich, dass PyInstaller zumindest für Python 2.7 eine bessere und einfachere Option ist.

Diego
quelle
3
Das --onefileFlag hilft Ihnen nicht dabei, es unter Windows portierbar zu machen, da die ausführbare Datei weiterhin eine Verknüpfung mit der api-ms-win-crt-runtime-l1-1-0.dllBibliothek (oder / und anderen) herstellen möchte, die über das vcredistPaket installiert werden muss . Eine Abhängigkeit ist also noch vorhanden und muss vor dem Ausführen installiert werden.
Andry
27

Ja, es ist möglich, Python-Skripte in eigenständige ausführbare Dateien zu kompilieren.

Mit PyInstaller können Python-Programme unter Windows , Linux , Mac OS X , FreeBSD , Solaris und AIX in eigenständige ausführbare Dateien konvertiert werden . Es ist einer der empfohlenen Konverter.

py2exe konvertiert Python-Skripte nur in ausführbare Dateien auf der Windows-Plattform.

Cython ist ein statischer Compiler sowohl für die Programmiersprache Python als auch für die erweiterte Programmiersprache Cython.

fury.slay
quelle
2
Danke dafür. Ich habe py2exe verwendet und konnte die Symbole überhaupt nicht zum Laufen bringen. PyInstaller hat zum ersten Mal gearbeitet und sieht gut aus!
Chud37
Kann ich eine eigenständige ausführbare Datei unter Windows für Linux und MacOS erstellen? Oder sollte ich Linux und macOS auf VirtualBox installieren? Ich habe nicht genügend freien Speicherplatz auf meinem Laptop.
8Observer8
1
Ich fand eine Antwort auf meine Frage in der Dokumentation hier: pyinstaller.readthedocs.io/en/stable/…
8Observer8
26

Und eine dritte Option ist cx_Freezedie plattformübergreifende.

Katriel
quelle
1
Hier sind wir im Februar 2019 und cx_Freezeseit Ende 2017 gibt es keine aufgelisteten Veröffentlichungen auf pypi. Wurde dieses Projekt abgebrochen?
user9074332
17

Sie mögen vielleicht py2exe . Dort finden Sie auch Infos dazu unter Linux

user237419
quelle
2
Aber Sie müssen ihm das Paket alle Option geben.
Jakob Bowyer
14

Verwenden Sie py2exe .... Verwenden Sie die folgenden Setup-Dateien:

 from distutils.core import setup
 import py2exe

 from distutils.filelist import findall
 import matplotlib

 setup(
       console=['PlotMemInfo.py'],

       options={
                'py2exe': {
                'packages' : ['matplotlib'],
            'dll_excludes': ['libgdk-win32-2.0-0.dll',
                                 'libgobject-2.0-0.dll',
                 'libgdk_pixbuf-2.0-0.dll']
                          }
                },
       data_files = matplotlib.get_py2exe_datafiles()
     )
Anand
quelle
Ich habe dies getan und es hat eine python27.dll-Datei erstellt und es ist immer noch erforderlich. Ich habe die EXE-Datei aus dem Ordner verschoben, in dem sich die Datei python27.dll befindet, und die EXE-Datei wird nicht mehr ausgeführt.
mjwrazor
Könnten Sie ein solches Skript für Linux und MacOS zeigen? Ich möchte eigenständige ausführbare Dateien unter Windows für Linux und MacOS erstellen.
8Observer8
13

Ich mag Pyinstaller - besonders die "Fenster" -Variante:

pyinstaller --onefile --windowed myscript.py

Es wird eine einzelne * .exe-Datei in einem dist / -Ordner erstellt.

cslotty
quelle
11

Ich empfehle auch Pyinstaller für eine bessere Abwärtskompatibilität wie Python 2.3 - 2.7.
Für py2exe benötigen Sie Python 2.6

yantaq
quelle
Pyinstaller hat Importprobleme. Zum Beispiel: In meinem Fall bin ich in diesem DIR ~ / Documents / python101 / und ex50_pycomp.py & ex50.py befinden sich in diesem Verzeichnis. ex50_pycomp.py importiert ex50.py. Ich starte pyinstaller ex50_pycomp.py und ich sehe alle konform, produziert dist. Alles gut, oder? Ich cd in dist / ex50_pycomp / und starte ex50_pycomp es funktioniert. Sobald ich dieses ex50_pycom in eine virtuelle Maschine gestellt habe, heißt es Importfehler und in einer anderen Linux-Box steht "-bash: ./ex_50_pycom: Binärdatei kann nicht ausgeführt werden: Formatfehler ausführen"
getriebener_spider
prob1: Ich habe python2.7 verwendet, aber pyinstaller hat mit python3 gesprochen python3 setup.py build python3 setup.py installiere deinen python3 bekomme alle pkg_resources prob 3: wenn die Verwendung von sys_path ein Problem wird, gib deinen Pfad wie diesen pyinstaller --hidden- import = pkg_resources --onefile file.py --path = my_path rw-rw-r-- my_path: Der dist-Ordner von python3 pyinstaller --hidden-import = pkg_resources --onefile file.py --path = / usr / local / lib /python3.5/dist-packages/my_code_lib-0+untagged.8.gd264bd5.dirty-py3.5.egg/my_folder -rw-rw-r--
powered_spider
8

Für Python 3.2-Skripte ist Cxfreeze die einzige Wahl. Erstellen Sie es aus Quellen, sonst funktioniert es nicht.

Für Python 2.x empfehle ich Pyinstaller, da es ein Python-Programm in einer einzigen ausführbaren Datei verpacken kann, im Gegensatz zu CxFreeze, das auch Bibliotheken ausgibt.

ravi.chunduru
quelle
6

py2exe erstellt die gewünschte exe-Datei, Sie müssen jedoch dieselbe Version von MSVCR90.dll auf dem Computer haben, auf dem Sie Ihre neue exe verwenden möchten. Weitere Informationen finden Sie unter http://www.py2exe.org/index.cgi/Tutorial .

Belial
quelle
6

Die Liste der Verteilungsdienstprogramme finden Sie unter https://wiki.python.org/moin/DistributionUtilities .

Ich benutze bbfreeze und es hat sehr gut funktioniert (aber noch keine Python 3-Unterstützung).

Joe
quelle
stackoverflow.com/questions/33683133/… Ich benutze bbfreeze sehr schönes Paket.
user914425
Kümmert es sich um Abhängigkeiten und installiert relevante Py-Module?
Volatil3
@ Volatil3 Ja, alle Abhängigkeiten werden berücksichtigt. WRT zur Installation von Modulen auf dem Host-System - es gibt verschiedene Arten von Kompilierungen. Der bbfreeze kompiliert alles in mehrere .soDateien oder kopiert die .egg-Dateien direkt und sie müssen alle in einem einzigen Verzeichnis (oder als einzelne Datei) vorhanden sein. Es ist keine Installation erforderlich.
Joe
6
pyinstaller yourfile.py -F --onefile

Dadurch wird eine eigenständige EXE-Datei in Windows erstellt. WICHTIGER HINWEIS: Die exe-Datei wird in einem Ordner mit dem Namen 'dist' generiert.

Sie können Pyinstaller mit installieren pip install PyInstaller

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

ShadyMBA
quelle
4

Nicht gerade eine Verpackung des Python-Codes, aber es gibt jetzt auch mürrisch von Google, das den Code in Go transpiliert. Die Python C-API wird nicht unterstützt, daher funktioniert sie möglicherweise nicht für alle Projekte.

freeformz
quelle
4

Mit Pyinstaller habe ich eine bessere Methode gefunden, indem ich eine Verknüpfung zur EXE-Datei verwendet habe, anstatt sie zu erstellen --onefile. Wie auch immer, es gibt wahrscheinlich einige Datendateien und wenn Sie eine Site-basierte App ausführen, hängt Ihr Programm auch von HTML-, JS- und CSS-Dateien ab. Es macht keinen Sinn, all diese Dateien irgendwohin zu verschieben. Stattdessen, was ist, wenn wir den Arbeitspfad nach oben verschieben.

Erstellen Sie eine Verknüpfung zur Exe, verschieben Sie sie nach oben und legen Sie die Ziel- und Startpfade wie angegeben fest, damit die relativen Pfade zum Ordner dist \ gehen: Target: %windir%\system32\cmd.exe /c start dist\web_wrapper\web_wrapper.exe Start in: "%windir%\system32\cmd.exe /c start dist\web_wrapper\" Kann die Verknüpfung zu einer beliebigen Umbenennung in "GTFS-Manager" umbenennen.
Jetzt, wenn ich verdopple -Klicke auf die Verknüpfung, es ist, als hätte ich die Datei mit Python ausgeführt! Ich fand diesen Ansatz besser als den folgenden --onefile:

  1. Im Fall von onefile gibt es ein Problem mit einer fehlenden DLL für Win7 OS, für die eine vorherige Installation usw. erforderlich ist. Gähnen. Mit dem üblichen Build mit mehreren Dateien gibt es keine derartigen Probleme.
  2. Alle Dateien, die mein Python-Skript verwendet (es stellt einen Tornado-Webserver bereit und benötigt eine ganze verdammte Website im Wert von Dateien, um dort zu sein!), Müssen nirgendwo verschoben werden: Ich erstelle einfach die Verknüpfung oben.
  3. Ich kann genau diesen Ordner in Ubuntu (führen Sie python3 myfile.py aus) und Windows (doppelklicken Sie auf die Verknüpfung) verwenden.
  4. Ich muss mich nicht mit dem übermäßig komplizierten Hacken von .spec-Dateien beschäftigen, um Datendateien usw. einzuschließen.

Oh, denken Sie daran, den Build-Ordner nach dem Erstellen zu löschen, um Größe zu sparen.

Nikhil VJ
quelle
Hallo, ich aktualisiere nur. Ich habe beschlossen, auf die UPX-Komprimierung zu verzichten und endlich den --onefile-Weg zu gehen. Musste eine auswählen, da UPX derzeit einen Fehler beim Komprimieren einer bestimmten DLL hat.
Nikhil VJ
3

Verwenden Sie Cython, um nach c zu konvertieren, zu kompilieren und mit gcc zu verknüpfen. Eine andere Möglichkeit besteht darin, die Kernfunktionen in c (die Funktionen, die Sie nur schwer rückgängig machen möchten) zu erstellen, sie zu kompilieren und den kompilierten Code mit Python Boost zu importieren (und Sie erhalten eine viel schnellere Codeausführung). Verwenden Sie dann ein beliebiges Werkzeug zum Verteilen.

F.Moure
quelle
1

Mir wurde gesagt, dass PyRun, https://www.egenix.com/products/python/PyRun/ , ebenfalls eine Option ist.

Kraig Brockschmidt - MSFT
quelle
5
Ein Link zu einer Lösung ist willkommen, aber stellen Sie sicher, dass Ihre Antwort ohne sie nützlich ist: Fügen Sie dem Link einen Kontext hinzu, damit Ihre Mitbenutzer eine Vorstellung davon haben, was es ist und warum es dort ist, und zitieren Sie dann den relevantesten Teil der Seite, die Sie verwenden. erneutes Verknüpfen mit, falls die Zielseite nicht verfügbar ist. Antworten, die kaum mehr als ein Link sind, können gelöscht werden.
Petter Friberg
Diese Option unterstützt derzeit Windows nicht.
Bob