Vergleich zwischen pyinstaller und py2exe

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Andy
User
Beiträge: 196
Registriert: Sonntag 1. Januar 2006, 20:12
Wohnort: aus dem hohen Norden....

Dienstag 10. April 2007, 23:18

Hallo @ all,

Jens und ich haben uns hier http://www.python-forum.de/post-64297.html#64297 gefragt, ob der http://pyinstaller.python-hosting.com/c ... i/report/1 kleine Dateien erzeugen kann? Wie klein diese sind, und ob der pyinstaller ausgereift ist. Daher habe ich einfach mal einen Vergleich gemacht

Vorweg für alle die es nicht wissen:

Pyinstaller kann single-file executables durch setzen der Option onefile erzeugen.

py2exe kann unter Umständen durch compression http://www.py2exe.org/index.cgi/BetterCompression eine relativ klein gehaltene Installationsexecutable, wofür unter anderem das Inno Setup (ein Windows Installer) sorgt, erzeugen.

Auch py2exe kann selbstständig single-file executables erzeugen. Jedoch habe ich bei Verwendung von Tkinter und folgender setup.py (ist die die py2exe beilegt) zwar den dist und build Ordner sowie einer standalone-EXE erhalten, leider brach diese jedoch beim Starten m. einer f. XP typischen Fehlermldg. "es wurde ein Prob. festgestellt" ab. Mit dem wx.window-Beispiel was ebenfalls py2exe beiliegt, hat´s dagegen funktioniert. :?

EDIT: http://paste.pocoo.org/show/1379/ Script ausgelagert

Nun der Vergleich mit meinem Test-Script:

***********************************************************************
Das Sript selbst ist 8,03 KB groß.
***********************************************************************
pyinstaller normal mit dist-Ordner: 4,80 MB
pyinstaller (Build-Ordner kann gelöscht werden) es bleibt also nur die Exe: 2,40 MB
Py2exe normal compiliert (Single-File ging ja nicht in meinem Bsp.) also dist-Ordner: 7,75 MB :shock: :evil:
***********************************************************************
pyinstaller hat mir vom Ablauf her sehr gut gefallen. Die Optionen werden direkt in der Konsole statt in einer setup.py eingegeben. Zugegeben, das kann am Anfang verwirrend sein, ist finde ich jedoch praktischer als eine setup.py

Das erwähnte wx.python-Beispiel von py2exe ist in seiner Ur-Form 1,42 KB groß. Mit py2exe als single file executable bin ich auf stolze 4,80 MB gekommen. :shock: :evil:

Getestet habe ich mit Python 2.4; pyinstaller 1.3; py2exe 0.6.5.; Win XP


@Jens: Du fragtest: ob wir den Wiki-Eintrag editieren sollten. Ja ich wäre dafür weil ja eigentlich fehlt, dass man eine single-file executable erstellen kann. Zum anderen wäre auch geklärt, dass man hiermit relativ kleine Exe-Dateien erzeugen kann. Ok 2,40 MB sind immerhin keine 8,03 KB, aber im Vergleich zu py2exe wo man ja mit der umständlichen Kompression kleinere Werte erreichen kann, kann ich mit 2,40 MB auch noch leben.

Ich würde wenn keiner negatives über den pyinstaller erfahren hat, dann auch eine Anleitung ins Wiki stellen. (Das im Wiki vorhandene Video zeigt leider nicht, wie man zu einer einzigen EXE kommt.) :x
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Mittwoch 11. April 2007, 22:52

Eine Frage ich konnte es leider nicht selber testen bis jetzt.

Macht PyInstaller bei Singel Files echte singels oder ist das eine exe die ohne Dialog sich ins Tempverzeichnis legt, und dort dann die selben Dateien liegen wie in der nicht Singel File Version?
Andy
User
Beiträge: 196
Registriert: Sonntag 1. Januar 2006, 20:12
Wohnort: aus dem hohen Norden....

Donnerstag 12. April 2007, 09:47

Sr4l hat geschrieben:Eine Frage ich konnte es leider nicht selber testen bis jetzt.

Macht PyInstaller bei Singel Files echte singels oder ist das eine exe die ohne Dialog sich ins Tempverzeichnis legt, und dort dann die selben Dateien liegen wie in der nicht Singel File Version?
A --onefile works by packing all the shared libs / dlls into the archive attached to the bootloader executable (or next to the executable in a non-elf configuration). When first started, it finds that it needs to extract these files before it can run "for real". That's because locating and loading a shared lib or linked-in dll is a system level action, not user-level. With PyInstaller v1.0 it always uses a temporary directory (_MEIpid) in the user's temp directory. It then executes itself again, setting things up so the system will be able to load the shared libs / dlls. When executing is complete, it recursively removes the entire directory it created.
Scheint ein temporäres Verzeichnis zu brauchen. (das meinst Du glaube ich nicht) Pyinstaller macht eine einzige .exe-Datei. Das was natürlich dazu kommt, sind etwa Bilder, Icons etc.

Man selbst startet den Build-Vorgang, so wie es bspw. bei py2exe im Hintergrund gemacht wird. Darauf schliesst sich, dass man also nur
eine exe + einen Build-Ordner erhält. Den Build-Ordner kann man löschen, (enthält eh nur eine Datei). Den dist-Ordner gibt es dann gar nicht mehr. (Aber ich glaube, den hattest Du doch gemeint, oder?)

Pyinstaller macht in der Tat kleine .exe-Dateien. Das ist f. mich persönlich die Hauptsache. 8)
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Donnerstag 12. April 2007, 09:58

Naja, klein ist Relativ.

Nach deinen obrigen Angaben hast du am Ende ein 2,40MB große EXE-Datei, oder?
Da ist py2exe besser, wenn man sich die zusätzliche Arbeit macht:
jens hat geschrieben:http://www.py2exe.org/index.cgi/BetterCompression (siehe Abschnitt "7ZIP and UPX") In dem genannten Beispiel bleiben ca 800KB...
Das Auspacken in einem Temp-Verz. dürfte die Startzeit spürbar verlängern, oder? Wäre eigentlich nett, wenn das im Speicher passieren würde, was wohl aber nicht ganz so einfach sein dürfte...

Naja, wie man es dreht und wendet. Es bleibt dabei, das man keine kleinen EXE Dateien mit Python erstellen kann.
Ich hab es mal unter [wiki]Python#AllgemeineVorUndNachteileVonPython[/wiki]unter "Contra" Aufgeschrieben.

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Andy
User
Beiträge: 196
Registriert: Sonntag 1. Januar 2006, 20:12
Wohnort: aus dem hohen Norden....

Donnerstag 12. April 2007, 10:18

Da möchte ich nur noch in den Raum werfen, das Pyinstaller solche Kompressionsvorgänge ebenfalls unterstützt. http://pyinstaller.python-hosting.com/f ... xecutables und http://pyinstaller.python-hosting.com/f ... troduction

Wobei ich dies nicht getestet habe, und auch nicht auf die 800 KB drauf aus bin. :D

Frage: Soll ich jetzt im Wiki noch auf die single-file Executable hinweisen, und eine Anleitung reinstellen?
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Donnerstag 12. April 2007, 10:25

Andy hat geschrieben:Frage: Soll ich jetzt im Wiki noch auf die single-file Executable hinweisen, und eine Anleitung reinstellen?
Auf jeden Fall. Und pack PyInstaller nach oben. Also zuerst darauf Hinweisen. Ist ja IMHO z.Z. die neuste Entwicklung und bietet die besten Features...

btw.: http://pyinstaller.python-hosting.com/ticket/10 8)

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Donnerstag 12. April 2007, 19:34

jens hat geschrieben:Das Auspacken in einem Temp-Verz. dürfte die Startzeit spürbar verlängern, oder?
Das Auspacken von UPX-komprimierten Programmen verlängert die Startzeit ja auch. Und es verbraucht Speicher, weil die Programme in den Speicher entpackt werden.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Mephisto
User
Beiträge: 28
Registriert: Mittwoch 17. Januar 2007, 15:52

Donnerstag 12. April 2007, 22:30

Ich hab wenn ich mit py2exe Apps verteilt hab, meistens dann das Ergebniss in eine .rar oder .tar.gz gesteckt, und bin immer recht gut damit gefahren. Programme die wx verwenden werden normal so ca. 12mb (wenn ich mich recht erinner) und dann nach dem Komprimieren meistens so ca. 2-3mb. Der Ansatz kostet nur einmal Zeit zum entpacken und in Zeiten von DSL sind 3mb hoch oder runterladen auch kein Beinbruch mehr (waren es selbst zu 56k Zeiten für mich nicht :)).

greets meph
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Freitag 13. April 2007, 08:10

So, ich hab auch mal tests gemacht. (Alles unter Windows mit Python 2.4)

Das Mini-Skript ist nur eine print Ausgabe. Das TK-Skript öffnet nur eine GUI mit ein paar Elementen, ist aber ohne Logik.

PyInstaller v1.3
  • Mini-Skript
    • single file
      mit UPX: 1,43MB
      ohne UPX: 1,64MB
    • Ordner (8 Dateien)
      mit UPX: 1,51MB
      ohne UPX: 3,17MB
  • TK-Test
    • single file:
      mit UPX: 2,08MB
      ohne UPX: 2,40MB
    • Ordner (11 Dateien)
      mit UPX: 2,20MB
      ohne UPX: 4,79MB

py2exe v0.6.6
Mini-Skript (8 Dateien + 7-Zip + UPX): 1,41MB
TK-Test (11 Dateien + 7-Zip + UPX): 2,09MB

Mit py2exe gibt es allerdings einen Fehler, beim starten der EXE:
zipimport.ZipImportError: can't decompress data; zlib not available
Die PyInstaller EXE klappen ohne Probleme.

Das hätte ich jetzt aber nicht gedacht. Hätte gedacht, das 7-ZIP noch etwas rausholen kann, tuts aber nicht wirklich. Dann lohnt sich der ganze Aufwand nicht wirklich.

Fazit: PyInstaller ist auf jeden Fall zu bevorzugen. Dennoch ist eine kleine commandline App mit 1,43MB nicht gerade klein :(

EDIT: Ach, nochwas... Um die Ergebnisse nicht zu verfälschen, sollte man immer im PyInstaller-Verzeichnis das cache Verzeichnis löschen :)

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Samstag 14. April 2007, 12:44

jens hat geschrieben:Mit py2exe gibt es allerdings einen Fehler, beim starten der EXE:
zipimport.ZipImportError: can't decompress data; zlib not available
Du musst wohl in der setup.py angeben, dass die zlib auch mit eingepackt werden soll.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Samstag 14. April 2007, 13:02

Dennoch ist eine kleine commandline App mit 1,43MB nicht gerade klein
Nun gut. Ich sehe das anders. Solange nicht für jede `print` Zeile 1,43 MB dazukommen is es kein Problem. Denn ich denke mal, das eine EXE ein wenig mehr Beinhaltet, als nur das Programm oder? Ich denke mal, 1,4 MB sind dann allein EXE-Logik (was auch immer ;) ) und danach folgt das Program. Kannst ja mal austesten, inwieweit sich der Wert ändert, bei 5 `print` Anweisungen (am besten die gleichen!). Währe mal interessant.

MfG EnTeQuAk
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Samstag 14. April 2007, 13:20

Da hast du wahrscheinlich recht. Das eigentliche Skript bläht das Endergebnis nicht viel weiter auf. Der dicke Broken ist halt der Python Interpreter selber und die Module die man verwendet...

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Samstag 14. April 2007, 16:04

py2exe und PyInstaller sind beides nur (kann man das so sagen? ;-) ) Linker.

Sie erschaffen ein minimales Python das 3kb Script zum Beispiel wird auch immer noch interpretiert und zum Interpretieren braucht Python halt sich selber mit allen seinen möglichkeiten was sich in der Größe zeigt und auch bei den GUIs wird alles mitgelifert.

Hat den Nachteil: große Programme, Vorteil lauffähig weil alles dabei ist auch auf unterschielichen Betriebs Systemen (sogar Wine tauglich).
Andy
User
Beiträge: 196
Registriert: Sonntag 1. Januar 2006, 20:12
Wohnort: aus dem hohen Norden....

Samstag 14. April 2007, 18:12

Sr4l hat geschrieben:Sie erschaffen ein minimales Python das 3kb Script zum Beispiel wird auch immer noch interpretiert und zum Interpretieren braucht Python halt sich selber mit allen seinen möglichkeiten was sich in der Größe zeigt und auch bei den GUIs wird alles mitgelifert.

Hat den Nachteil: große Programme, Vorteil lauffähig weil alles dabei ist auch auf unterschielichen Betriebs Systemen (sogar Wine tauglich).
Stimmt! Der PyInstaller hat es aber bedingt in sich, von einigen Modulen etc. nur das zu nehmen, was er wirklich zum ausführen braucht.
Das habe ich nur anhand der Option Tk gemerkt: Gibt man diese nicht an, so wird nur brauchbares gepackt. Gibt man diese an, ist der gesamte tcl-Ordner wie halt bei py2exe mit dabei.
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Samstag 14. April 2007, 18:40

Das sind nur Lösungen für Situationen wo du kein Python installieren kannst/willst. Da spielen Dateigrößen keine Rolle. Ansonsten ist noch rpython eine Idee. :wink:
TUFKAB – the user formerly known as blackbird
Antworten