Seite 1 von 1

import wx -> Pyinstaller -> exe -> Verursacht Fehle

Verfasst: Mittwoch 18. Februar 2009, 10:37
von TiKaey
Hi,

nachdem ich nun mein letztes Projekt soweit fürs erste Fertig gestellt habe, kommen schon die nächsten Probleme, und ich hoffe mal, dass da jemand einen passenden Rat hat.
Diverse Suchen im Netz und auch hier im forum sind natürlich vorausgegangen (gestern 6 Stunden ohne wirkliches Ergebnis).

Ich habe ein Projekt in Arbeit, welches wxPython verwendet, dieses habe ich natürlich per "import wx" eingebunden. Und genau hierdrüber stolpert "etwas". Als solches funktioniert das Projekt auch unter Win einwandfrei, sobald ich aber eine exe daraus erstelle, wird ein Fehler verursacht.
DrWatson meldet immer das gleiche:
Die Anwendung "" hat einen Programmfehler verursacht. Datum und Zeit des Fehlers: 17.02.2009 um 21:53:24.733 Ausnahme: c0000005 an Adresse 01945F25 (<nosymbols>)
Die Uhrzeit und das Datum variieren natürlich entsprechend. ;o)

Um die Ursache einzuschränken habe ich eine Hallo-Welt mit dem import wx geschrieben, bei der die exe auch stolpert.

Code: Alles auswählen

#!/usr/bin/python

import wx

print 'Hallo Welt'
Fehler bei der Erstellung mit Pyinstaller gab es nur insofern, wie es scheinbar laut Recherche bei jedem auftritt.
W: no module named posix (conditional import by os)
W: no module named optik.__all__ (top-level import by optparse)
W: no module named readline (delayed, conditional import by cmd)
W: no module named readline (delayed import by pdb)
W: no module named pwd (delayed, conditional import by posixpath)
W: no module named org (top-level import by pickle)
W: no module named sip (top-level import by wx)
W: no module named posix (delayed, conditional import by iu)
W: no module named fcntl (conditional import by subprocess)
W: no module named org (top-level import by copy)
W: no module named _emx_link (conditional import by os)
W: no module named optik.__version__ (top-level import by optparse)
W: no module named fcntl (top-level import by tempfile)
W: __all__ is built strangely at line 0 - collections (c:\Python26\lib\collections.pyc)
W: delayed exec statement detected at line 0 - collections (c:\Python26\lib\collections.pyc)
W: delayed conditional __import__ hack detected at line 0 - doctest (c:\Python26\lib\doctest.pyc)
W: delayed exec statement detected at line 0 - doctest (c:\Python26\lib\doctest.pyc)
W: delayed conditional __import__ hack detected at line 0 - doctest (c:\Python26\lib\doctest.pyc)
W: delayed __import__ hack detected at line 0 - encodings (c:\Python26\lib\encodings\__init__.pyc)
W: __all__ is built strangely at line 0 - optparse (c:\Python26\pyinstaller-1.3\optparse.pyc)
W: __all__ is built strangely at line 0 - dis (c:\Python26\lib\dis.pyc)
W: delayed eval hack detected at line 0 - os (c:\Python26\lib\os.pyc)
W: __all__ is built strangely at line 0 - __future__ (c:\Python26\lib\__future__.pyc)
W: delayed conditional __import__ hack detected at line 0 - unittest (c:\Python26\lib\unittest.pyc)
W: delayed conditional __import__ hack detected at line 0 - unittest (c:\Python26\lib\unittest.pyc)
W: __all__ is built strangely at line 0 - tokenize (c:\Python26\lib\tokenize.pyc)
W: __all__ is built strangely at line 0 - wx (c:\Python26\lib\site-packages\wx-2.8-msw-unicode\wx\__init__.pyc)
W: __all__ is built strangely at line 0 - wx (c:\Python26\lib\site-packages\wx-2.8-msw-unicode\wx\__init__.pyc)
W: delayed exec statement detected at line 0 - bdb (c:\Python26\lib\bdb.pyc)
W: delayed eval hack detected at line 0 - bdb (c:\Python26\lib\bdb.pyc)
W: delayed eval hack detected at line 0 - bdb (c:\Python26\lib\bdb.pyc)
W: delayed __import__ hack detected at line 0 - pickle (c:\Python26\lib\pickle.pyc)
W: delayed __import__ hack detected at line 0 - pickle (c:\Python26\lib\pickle.pyc)
W: delayed conditional exec statement detected at line 0 - iu (c:\Python26\pyinstaller-1.3\iu.pyc)
W: delayed conditional exec statement detected at line 0 - iu (c:\Python26\pyinstaller-1.3\iu.pyc)
W: delayed eval hack detected at line 0 - gettext (c:\Python26\lib\gettext.pyc)
W: delayed __import__ hack detected at line 0 - optik.option_parser (c:\Python26\pyinstaller-1.3\optik\option_parser.pyc)
W: delayed conditional eval hack detected at line 0 - warnings (c:\Python26\lib\warnings.pyc)
W: delayed conditional __import__ hack detected at line 0 - warnings (c:\Python26\lib\warnings.pyc)
W: __all__ is built strangely at line 0 - optik (c:\Python26\pyinstaller-1.3\optik\__init__.pyc)
W: delayed exec statement detected at line 0 - pdb (c:\Python26\lib\pdb.pyc)
W: delayed conditional eval hack detected at line 0 - pdb (c:\Python26\lib\pdb.pyc)
W: delayed eval hack detected at line 0 - pdb (c:\Python26\lib\pdb.pyc)
W: delayed conditional eval hack detected at line 0 - pdb (c:\Python26\lib\pdb.pyc)
W: delayed eval hack detected at line 0 - pdb (c:\Python26\lib\pdb.pyc)
Verwendete Versionen sind übrigens Python 2.6.1 mit entsprechenden Tools wxPython2.8-win32-unicode-2.8.9.1-py26.exe und dem Pyinstaller 1.3.
Versionskonflikte oder ähnliche fallen mir zumindest keine auf.

In der Recherche habe ich auch was von Hooks gelesen (keine Ahnung ob das die Ursache ist), jedoch werde ich da aus der Doc nicht schlau. Nach einem Tipp habe ich dann mal ein Hook mit "sip" rein gepackt (Abkopiert von nem anderen Hook), aber auch das hat keine Änderung bewirkt.

Bin ich nun doof, blind oder liegt der Fehler nicht bei mir?

Verfasst: Mittwoch 18. Februar 2009, 17:19
von str1442
Ich weiß zwar nicht genau, woher die Warnungen kommen, aber da steht doch, das diverse Module nicht eingebunden werden konnten (zb Readline, was man auf Windows Systemen eher selten findet). Sofern du deine "exe" mit Py2Exe erstellst, und Py2Exe keine Ausnahmebehandlung für sowas kennt und die Warnungen von Py2Exe kommen, hast du in der Exe dann fehlende Module. Wenn ich das nun richtig interpretiert habe.

Warum benutzt du überhaupt Py2Exe? Verteil doch einfach das Python Skript.

Verfasst: Mittwoch 18. Februar 2009, 17:33
von sea-live
für so unkomplizierte sachen verwende besser py2exe
die setup.py sieht dann so aus

Code: Alles auswählen

from distutils.core import setup
import py2exe

setup(console=['meinpythonscript.py'])

Verfasst: Mittwoch 18. Februar 2009, 23:11
von TiKaey
str1442 hat geschrieben: Warum benutzt du überhaupt Py2Exe? Verteil doch einfach das Python Skript.
Das war Pyinstaller, nicht Py2exe. Und Das Python-Script zu verteilen geht in dem Benutzerkreis nicht, damit wären die eindeutig überfordert.

sea-live: Ab wann ist es denn kompliziert genug? *g* Ich hatte mal irgendwo gelesen, dass es mit dem Pyinstaller weniger Probleme gibt, daher hatte ich den genommen, aber werde dann mal Py2exe ausprobieren.

Verfasst: Mittwoch 18. Februar 2009, 23:19
von ms4py
Ich hatte bisher im Prinzip noch gar keine Probleme mit py2exe, auch bei sehr komplexen Programmen (gtk + matplotlib + psycopg2).
z.T. muss man halt manuell ein paar *.dll Dateien kopieren, aber man bekommt immer schön angezeigt, welche fehlt ;)

Verfasst: Freitag 20. Februar 2009, 12:13
von TiKaey
Okay, nachdem ich jetzt rausgefunden habe, welche DLL ihm fehlt, habe ich es mit py2exe zum Laufen bekommen.
Leider ist die Dateigröße nachher gigantisch mit dem was schon ohne die zusätzlichen DLLs benötigt wird. 15,9 MB für ein kleines Skript.
Mit UPX hat leider auch nicht viel geholfen, gerade mal 0,5 MB Unterschied.

Mit Pyinstaller war die exe nachher nur ~ 6 MB groß. Okay, die verursacht einen Fehler und wird geschlossen, allerdings auch wenn ich die ganze DLLs mit reinpacke, die ich von py3exe her weiß.
Keine Ahnung wo jetzt der Unterschied bei den exe liegt.

Nun ja, vorerst muss es dann mal so reichen.
Ich danke für die Hilfe. :o)

Verfasst: Freitag 20. Februar 2009, 21:37
von CM
Weiß nicht, ob es Dir hilft, aber: http://www.python-forum.de/topic-5726.html
Zeigt das vorgehen für cx_freeze mit Windows.

Gruß,
Christian

Verfasst: Sonntag 22. Februar 2009, 19:54
von TiKaey
Du wirst lachen, aber da bin ich auch schon drüber gestolpert. *g*
Aber entweder liegt es an der anderen Version (Die Anleitung ist ja bald 3 Jahre alt) oder irgendwas ist nicht richtig installiert worden.
Werde das aber die Tage nochmal angehen.

Verfasst: Sonntag 22. Februar 2009, 20:44
von gerold
TiKaey hat geschrieben:Aber entweder liegt es an der anderen Version (Die Anleitung ist ja bald 3 Jahre alt) oder irgendwas ist nicht richtig installiert worden.
Hallo TiKaey!

Stimmt! Die Anleitung ist etwas veraltet. Inzwischen gibt es einen Windows-Installer für cx_freeze. Und das cx_freeze-Hauptprogramm heißt jetzt "freeze". Man muss nur noch den Pfad zum Python-Script-Ordner zum Pfad hinzufügen.
Die Dokumentation und die mitgelieferten Beispiele geben Aufschluss über die möglichen Vorgehensweisen.

Wenn ich mehr Zeit habe, werde ich die Anleitung mal etwas überarbeiten.

mfg
Gerold
:-)

Verfasst: Sonntag 22. Februar 2009, 21:41
von TiKaey
Hm, dann ist in der Aussage und in der Doku aber auch noch ein Fehler, denn "freeze" ist bei mir nirgendwo der Name einer Datei, sondern lediglich cxfreeze.bat und cxfreeze, ohne Endung, wobei der Inhalt Python ist, die von der cxfreeze.bat aufgerufen wird.
Daher gehe ich mal davon aus, dass cxfreeze.bat das "Hauptprogramm" ist.

Verfasst: Sonntag 22. Februar 2009, 21:45
von gerold
TiKaey hat geschrieben:"freeze" ist bei mir nirgendwo der Name einer Datei, sondern lediglich cxfreeze.bat und cxfreeze
Hallo TiKaey!

Ich hatte nur kurz in die Doku gesehen und da stand "freeze". Ich hätte selber nachsehen müssen. ;-)

mfg
Gerold
:-)