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.
Antworten
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

Hallo Leute,

folgendes Problem. Mit Py2Exe konnte ich offenbar ein Script in eine *.EXE-Datei umwandeln. Nun versuchte ich anschließend die Exe-Datei zu öffnen. Man sieht nur ganz kurz das cmd-Fenster. Aber das Python-Programm startet nicht. Nach mehrmaligen Durchläufen war ich so schnell und konnte ein ScreenShot machen.

Bild

Ich weiß, das Bild ist nicht sonderlich scharf. Das Fenster ist mir einfach zu schnell.

Aber was sagt mir nun diese Fehlermeldung? Also, unter Python-Interpreter funktioniert das Programm tadelos, auch die GUI wird gut angezeigt. Was mache ich hier falsch? Oder habe ich in der cmd-Konsole für py2exe falsche Befehle eingegeben?

Ich gab folgendes ein:

Code: Alles auswählen

python setup.py install
anschließend:

Code: Alles auswählen

python setupg.py py2exe
In der setup-Datei steht dann folgendes:

Code: Alles auswählen

from distutils.core import setup
import py2exe

setup(console=['bmi.py'])
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

Nun, ich bin durch die Recherche darauf gekommen, dass man in meinem Fall folgendes machen soll:

Code: Alles auswählen

python setup.py py2exe --includes sip
Doch irgendwie will mir das nicht gelingen. Hier, Foto:

Bild

Es tauchen erneut weitere Fehlermeldungen auf, die ich nicht verstehe.

Vielleicht könnt ihr mir weiterhelfen. Hier ist der Code (von BlackJack - der BMI-Rechner).

Code: Alles auswählen

#!/usr/bin/env python
import sys
from PyQt4 import uic
from PyQt4.QtGui import QApplication
 
 
def calculate_bmi(height, weight):
    return weight / height**2
 
 
class BMICalculator(object):
    def __init__(self):
        self.ui = uic.loadUi('bmi.ui')
        self.ui.close_button.clicked.connect(self.ui.close)
        self.ui.calculate_button.clicked.connect(self.on_calculate)
        self.ui.show()
 
    def on_calculate(self):
        size = self.ui.height_input.value()
        weight = self.ui.weight_input.value()
        try:
            result = str(calculate_bmi(size, weight))
        except ZeroDivisionError:
            result = ''
        self.ui.bmi_output.setText(result)
       
 
def main():
    application = QApplication(sys.argv)
    bmi_calculator = BMICalculator()
    sys.exit(application.exec_())
 
 
if __name__ == '__main__':
    main()
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Sophus: Es wird nicht alles automatisch zusammengepackt. Woher soll den Py2Exe wissen, dass Du noch externe Dateien, wie bmi.ui brauchst?
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Folgendes packt py2exe automatisch ein (kaskadierend):
  • Alle Python Module, die irgendwo im Quellcode mit "import" importiert werden.
  • Alle dll's die von den importierten Modulen benötigt werden (explizit verlinkt).
Folgendes muss in py2exe explizit konfiguriert werden:
  • Alle Resource-Dateien (ui, Icons, ...).
  • Alle Python Module, die nicht explizit mit "import" importiert werden.
  • dll's die über eine allgemeine Schnittstelle verlinkt sind und erst zur Laufzeit aufgelöst werden.
a fool with a tool is still a fool, www.magben.de, YouTube
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

Hallo @Sirius3 und MegaBen,

zu den ui-Dateien etc. Muss ich sie in den dist-Ordner mit hinein kopieren oder muss ich da ui-Dateien in der setup.py-Datei mit angeben? Wenn letzteres, dann klingt es richtig umständlich. Dachte, py2Exe nimmt alles mit, was dazugehört, denn die ui-Dateien werden ja durch loadUI auch "importiert" und die kennt py2exe nicht an? Wie sähe denn so ein Script aus, wenn man die ui-Dateien mit´nehmen will?
BlackJack

@Sophus: Woher soll py2exe denn wissen welcher Code irgendwelche Daten lädt die dann auch noch mit ausgeliefert werden müssen? Das mit den Modul-Importen geht weil ``import`` ein Schlüsselwort ist was in Python definiert ist, aber wie soll py2exe entscheiden das ``spam.parrot(nih)`` etwas ist das eine Datei lädt die mit in das ``dist/``-Verzeichnis soll. Nächste Schwierigkeit wäre dann statisch zu ermitteln was für einen Wert `nih` eigentlich hat.

Ich sehe auch nicht wo das ”umständlich” sein soll. Wenn es eine oder zwei Dateien sind, dann gibt man die halt direkt an, wenn es mehr werden stecken die in der Regel ja in Verzeichnissen und in der `setup.py` kann man ja Python-Code schreiben. Zum Beispiel um alle Dateinamen in einem Verzeichnis zu ermitteln.
Antworten