Seite 1 von 1

PyQt4 Programm zu exe Datei

Verfasst: Montag 15. Juni 2009, 18:43
von microkernel
Hallo,
ich arbeite seit einiger Zeit an einem Programm und jetzt wollte ich mal eine exe Datei draus machen. Normalerweise benutzte ich immer py2exe oder pyinstaller-1.3 aber bei beiden funktioniert es nicht.
Kann mir vielleicht jemand helfen?


lg
MicroKernel

Verfasst: Montag 15. Juni 2009, 19:11
von jerch
Warum es mit py2exe nicht funktioniert, kann ich Dir nicht sagen, da ich das Programm nicht verwende. Mit PyInstaller gibts bis Version 1.3 das Problem, das 'hidden imports' nicht aufgelöst werden. Hierzu benötigt PyInstaller sogenannte hooks, die für PyQt4 fehlenden Hook-Dateien findest Du hier http://www.pyinstaller.org/browser/trunk/hooks.

Verfasst: Montag 15. Juni 2009, 20:13
von snafu
Man sollte sich den Pyinstaller derzeit grundsätzlich als SVN runterladen. Der Autor hat seit Monaten (oder sogar Jahren?) kein neues Release herausgebracht und legt einem auch die besagte Vorgehensweise ans Herz.

Verfasst: Montag 15. Juni 2009, 20:24
von cofi
http://www.py2exe.org/index.cgi/Py2exeAndPyQt

Funktioniert nicht ist übrigens eine ganz schlechte Fehlerbeschreibung.

und jetzt?

Verfasst: Dienstag 16. Juni 2009, 19:17
von microkernel
Ich habe jetzt die hooks:
  • hook-PyQt4.py
    hook-PyQt4.Qt.py
    hook-PyQt4.QtCore.py (diese Module importiere ich auch normalerweise in mein Programm)
    hook-PyQt4.QtGui.py (diese Module importiere ich auch normalerweise in mein Programm)
    hook-qt.py
gedownloadet und in den Ordner "hooks" gelegt. Dann habe ich mit dem Befehl "python Makespec.py -F PyQt4-Programm.pyw" diese ".spec" Datei gemacht. Dannach führte ich den befehl "python Build.py PyQt4-Programm.spec" aus.
Doch die exe Datei funktionierte nicht. Um wenigsten einen Fehlercode zu bekommen führte ich die exe Datei in der Konsole aus. Die Fehlermeldung lautete:
Traceback (most recent call last):
File "<string>", line 6, in <module>
ImportError: cannot import name QtGui
Ich verstehe nicht was ich falsch gemacht habe. Kann mir jmd. helfen??

lg
MicroKernel

Verfasst: Dienstag 16. Juni 2009, 19:24
von lunar
Es heißt QtGui, irgendwo ist da also ein Tippfehler.

sry

Verfasst: Mittwoch 17. Juni 2009, 15:49
von microkernel
sorry, hab mich beim abschreiben der Fehlermeldung vertippt....

kommt schon

Verfasst: Freitag 19. Juni 2009, 15:34
von microkernel
Ach kommt schon irgendjemand muss das doch wissen. Ich bin hier unter hunderten von programmieren und keiner weis wie ich ne exe machen kann?

Verfasst: Freitag 19. Juni 2009, 15:39
von lunar
Du hast doch den Tippfehler im Programm korrigiert, wo ist denn jetzt dein Problem?

Verfasst: Freitag 19. Juni 2009, 15:41
von microkernel
nein ich hatte mich bein abschreiben der fehlermeldung vertippt. (Ich konnte sie nicht kopieren)

Verfasst: Freitag 19. Juni 2009, 15:57
von cofi
Ich kenne mich nur mit `py2exe` aus, allerdings auch nur oberflächlich, da ich dem Distributionsweg nichts abgewinnen kann.
Wie es mit `py2exe` funktioniert steht im verlinken FAQ-Eintrag. Eventuell noch ein paar `include`-Anweisungen, wenn das nicht richtig aufgelöst wird.

Verfasst: Freitag 19. Juni 2009, 18:06
von jerch
Da die SVN-Version von PyInstaller die fehlenden hooks enthält, solltest Du diese vllt. besser verwenden. Es geht aber auch mit der 1.3 und den kopierten hooks, der Fehler steckt vermutlich woanders. Kannst Du mal die PyInstalleranweisungen posten, die zum Erstellen nutzt? Bzw. die Dateiliste des build-Ordners? Gibt PyInstaller irgendwelche Warnungen aus?

Verfasst: Samstag 20. Juni 2009, 10:59
von microkernel
Also zum erstellen der spec-Datei gebe ich in der Eingabeaufforderung "python Makespec.py -F Programm.pyw" ein. Danach gebe ich ein "python Build.py Programm.spec". Dann habe die nicht funktionierende exe Datei.


Pyinstaller hat alle Warnungen in eine Datei geschrieben. Ich habe mal die log-datei hochgeladen. Hier könnt ihr sie sehen.



lg
Mirokernel

Verfasst: Samstag 20. Juni 2009, 12:47
von snafu
Es wäre wohl ganz gut, mal dein Programm zu sehen, um den Fehler nachvollziehen zu können...

Verfasst: Samstag 20. Juni 2009, 13:44
von jerch
Also ich hab das auch schon länger nicht mehr benutzt, aber für Dich nochmal durchexerziert. Mit folgenden Maßnahmen funktionierts:

- PyInstaller SVN-Version runterladen mit "svn co http://svn.pyinstaller.org/trunk" (nicht nur das pyinstaller-Verzeichnis, da das leer ist)
- configure.py durchlaufen lassen, darauf achten, das alle Abhängigkeiten erfüllt sind (z.B. MSVCR90.DLL für Python2.6)
- dann makespec und build

Getestet mit WinXP SP3, Python2.6 und PyQt4.5 und folgendem Skript:

Code: Alles auswählen

from PyQt4 import QtGui

app = QtGui.QApplication([])
win = QtGui.QWidget()
win.show()
app.exec_()
Laß doch mal -F weg, um zu sehen, ob er die PyQt-Bibliotheken überhaupt findet und dem dist-Ordner hinzufügt.

VIELEN DANK

Verfasst: Sonntag 21. Juni 2009, 11:53
von microkernel
Endlich! Jetzt funktioniert es! Vielen Dank an alle die mir geholfen haben!

Aber jetzt habe ich noch eine Frage:
Ich habe eine zweite Python Datei in welcher meine ganzen Resourcen für das Hauptprogramm sind. Diese Python Datei wird normalerweise nur importiert sodass die Resourcen zu verfügung stehen. Aber nachdem ich die exe Datei gebildet hatte reichte es nichtmehr diese Python Datei einfach in den Ordner zu legen wo auch die exe ist, um die Resourcen im Hauptprogramm anzeigen zu lassen.
Wie kann ich jetzt diese 2. Python Datei in mein Hauptprogramm einbinden sodass ich nur eine einzigste Datei habe?


lg
MicroKernel

Verfasst: Sonntag 21. Juni 2009, 13:11
von jerch
Darf man fragen, woran es gelegen hat? SVN-Version?

zu der Import-Sache:
PyInstaller löst sowas normalerweise auf, d.h. Deine Imports werden auch dem Binary hinzugefügt. Poste doch mal den Quellcode und was daran nicht funktioniert.

Bsp:
Hauptskript

Code: Alles auswählen

from PyQt4 import QtGui
import klaus

def gib_mir_klaus():    
    return klaus.klaus()

app = QtGui.QApplication([])
win = QtGui.QWidget()
win.show()
app.exec_()
print gib_mir_klaus()
klaus.py

Code: Alles auswählen

import maus

def klaus():
    return 'der klaus ' + maus.raus()
maus.py

Code: Alles auswählen

def raus():
    return 'ist raus'
Die Konsole meldet dann "der klaus ist raus", sowohl klaus.py als auch maus.py werden eingebunden.

Verfasst: Sonntag 21. Juni 2009, 13:22
von microkernel
Gar nichts hat an der SVN-Version gefehlt. Die SVN-Version war die Lösung. Nocheinmal Danke.

Und das mit den Imports hat sich jetzt auch geklärt.


Lg
MicroKernel

Verfasst: Montag 22. Juni 2009, 09:31
von snafu
microkernel hat geschrieben:Die SVN-Version war die Lösung.
Ich habe ja auch nicht zum Spass ganz am Anfang darauf verwiesen. :)

Aber du wolltest ja lieber selber im PyInstaller-Code rumpfuschen. ;)

Verfasst: Montag 22. Juni 2009, 17:04
von microkernel
sorry.... :lol: