Hallo,
zunächst muss ich mal sagen, dass ich mich erst seit 1 Woche mit Python beschäftige.
Ich habe die Aufgabe, aus einem Python Programm (welches ich nicht geschrieben habe) eine *.exe zu machen.
Dazu habe ich mir das Programm py2exe angeschaut aber bisher noch keine Ergebnisse erzielen können, d.h. es gibt beim Erstellen der exe Fehlermeldungen.
Ein weiteres Problem ist, dass dieses Python Programm zur Laufzeit dynamisch einige Module einbindet. py2exe geht aber nun davon aus, beim Erstellungsprozess alle erforderlichen Module mit in die Exe zu packen.
Daher die Frage, kann ich mit py2exe aus dem Python Programm überhaupt eine exe erstellen?
Danke & Gruß
Gunnar
p2exe und dynamisch geladene Module
-
- User
- Beiträge: 424
- Registriert: Montag 28. Juli 2003, 16:19
- Wohnort: /dev/reality
Es gibt mehrere Möglichkeiten, mit py2exe eine Exe zu erstellen.
Ich mache es z.B. so
setup.py:
dazu im selben Verzeichnis die setup.cfg:
Unter Packages gebe ich die Libs an, die nicht standardmäßig dabei sind.
So ist sichergestellt, das sie mit einbezogen werden.
und das ganze dann mit
aus der Kommandozeile aufrufen.
ansonsten hilft auch die py2exe-Homepage
weiter.
mfg, querdenker
Ich mache es z.B. so
setup.py:
Code: Alles auswählen
# setup.py
from distutils.core import setup
import py2exe
setup(name="starter",
console=["starter.py"],
)
Code: Alles auswählen
#distutils config-file
[py2exe]
packages = kinterbasdb, mx.DateTime
#no output at all
optimize=2
So ist sichergestellt, das sie mit einbezogen werden.
und das ganze dann mit
Code: Alles auswählen
python setup.py py2exe
ansonsten hilft auch die py2exe-Homepage
weiter.
mfg, querdenker
So, ich habe es jetzt geschafft, eine *.exe zu erstellen 
Leider startet sie nicht, ich bekomme nur folgende Ausgabe:
C:\Python23\dist>hifreezer
Traceback (most recent call last):
File "hifreezer.py", line 27, in ?
File "hifreezer.py", line 23, in main
File "C:/work/HiFreezer/build/src\m10\hfz\app.py", line 22, in ?
File "C:/work/HiFreezer/build/src\m10\hfz\appservice.py", line 23, in ?
File "C:/work/HiFreezer/build/src\m10\auth\proxy.py", line 18, in ?
File "C:/work/HiFreezer/build/src\snakeserver\YpageEngine.py", line 15, in ?
File "C:/work/HiFreezer/build/src\snakeserver\ypage\compiler.py", line 21, in ?
File "C:/work/HiFreezer/build/src\snakeserver\ypage\parser.py", line 14, in ?
File "C:/work/HiFreezer/build/src\snakeserver\ypage\tokenizer.py", line 23, in ?
LookupError: unknown encoding: UTF-8
Auf Rückfrage an die Entwickler des Python Programms habe ich als Antwort bekommen: Dies sei ein bekanntes Problem von py2exe, hängt irgendwie mit der verwendeten Version zusammen.
Kann mir jemand etwas genaueres dazu sagen?
Danek & Gruß
Gunnar

Leider startet sie nicht, ich bekomme nur folgende Ausgabe:
C:\Python23\dist>hifreezer
Traceback (most recent call last):
File "hifreezer.py", line 27, in ?
File "hifreezer.py", line 23, in main
File "C:/work/HiFreezer/build/src\m10\hfz\app.py", line 22, in ?
File "C:/work/HiFreezer/build/src\m10\hfz\appservice.py", line 23, in ?
File "C:/work/HiFreezer/build/src\m10\auth\proxy.py", line 18, in ?
File "C:/work/HiFreezer/build/src\snakeserver\YpageEngine.py", line 15, in ?
File "C:/work/HiFreezer/build/src\snakeserver\ypage\compiler.py", line 21, in ?
File "C:/work/HiFreezer/build/src\snakeserver\ypage\parser.py", line 14, in ?
File "C:/work/HiFreezer/build/src\snakeserver\ypage\tokenizer.py", line 23, in ?
LookupError: unknown encoding: UTF-8
Auf Rückfrage an die Entwickler des Python Programms habe ich als Antwort bekommen: Dies sei ein bekanntes Problem von py2exe, hängt irgendwie mit der verwendeten Version zusammen.
Kann mir jemand etwas genaueres dazu sagen?
Danek & Gruß
Gunnar
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Du muss das encodings Paket einbinden, damit das geht.
Code: Alles auswählen
from distutils.core import setup
import py2exe
setup(console=["starter.py"],
version = "1.0.0",
description = "Beschreibung",
name = "Kickstarter",
options = {
"py2exe" : {
"packages" :
['encodings']
}
}
)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Hallo,
nachdem ich es nun geschafft habe, eine exe zu erstellen, stehe ich nun vor dem nächsten Problem.
Und zwar hatte ich ja schon gesagt, dass das python Programm einige Module dynamisch lädt. Dies sind die Module für MaxDB und MySQL.
Kann mir jemand sagen, was ich in die setup.cfg schreiben muss, damit py2exe mir diese beiden Module mit in die exe packt.
Wenn es hilft, könnte ich die Fehlerausgabe posten.
Danke
Gunnar
nachdem ich es nun geschafft habe, eine exe zu erstellen, stehe ich nun vor dem nächsten Problem.
Und zwar hatte ich ja schon gesagt, dass das python Programm einige Module dynamisch lädt. Dies sind die Module für MaxDB und MySQL.
Kann mir jemand sagen, was ich in die setup.cfg schreiben muss, damit py2exe mir diese beiden Module mit in die exe packt.
Wenn es hilft, könnte ich die Fehlerausgabe posten.
Danke
Gunnar
-
- User
- Beiträge: 424
- Registriert: Montag 28. Juli 2003, 16:19
- Wohnort: /dev/reality
Hallo Gunnar,
generell ist es eigentlich immer hilfreich, die Fehlermeldungen mitzuposten. Dadurch können andere dir schneller helfen.
Und wie wäre es, wenn du dich mal registrierst?
Wenn du mit der setup.cfg arbeitest, hänge die Module in der packages-Zeile mit Kommata getrennt an.
Bsp.:
Wenn du nur die Setup.py benutzt, setzt du sie wie folgt:
Hoffe das jetzt auf die schnelle richtig gemacht zu haben.
mfg, querdenker
generell ist es eigentlich immer hilfreich, die Fehlermeldungen mitzuposten. Dadurch können andere dir schneller helfen.
Und wie wäre es, wenn du dich mal registrierst?
Wenn du mit der setup.cfg arbeitest, hänge die Module in der packages-Zeile mit Kommata getrennt an.
Bsp.:
Code: Alles auswählen
packages=mod1,mod2,mod3,mod4,.....,letztes_mod
Code: Alles auswählen
from distutils.core import setup
import py2exe
setup(console=["starter.py"],
version = "1.0.0",
description = "Beschreibung",
name = "Kickstarter",
options = {
"py2exe" : {
"packages" :
['mod1','mod2','mod3',......,'letztes_mod']
}
}
)
mfg, querdenker
So, habe mich mal angemeldet.
Nachfolgend poste ich mal die Fehlermeldung:
C:\Python23\dist>hifreezer init
Traceback (most recent call last):
File "C:/Dokumente und Einstellungen/holger/Eigene Dateien/Develop/workspace/HiFreezer/build/src\m10\hfz\app.py", line 386, in main()
Local bindings:
... hfz = <m10.hfz.app.HiFreezer object at 0x009F65B0>
File "C:/Dokumente und Einstellungen/holger/Eigene Dateien/Develop/workspace/HiFreezer/build/src\m10\hfz\app.py", line 55, in start(self=<m10.hfz.app.HiFreezer object at 0x009F65B0>)
File "C:/Dokumente und Einstellungen/holger/Eigene Dateien/Develop/workspace/HiFreezer/build/src\m10\hfz\app.py", line 176, in __createComponents(self=<m10.hfz.app.HiFreezer object at 0x009F65B0>)
File "C:/Dokumente und Einstellungen/holger/Eigene Dateien/Develop/workspace/HiFreezer/build/src\m10\hfz\app.py", line 342, in __getDatabase(self=<m10.hfz.app.HiFreezer object at 0x009F65B0>)
Local bindings:
... connFactory = <m10.db.factory.ConnectionFactory object at 0x00F29790>
... database = 'MaxDB'
... dbms_adapter = 'maxdb'
... dbms_params = {'host': 'localhost', 'password': 'PHFZP', 'user': 'HFZ', 'database': 'm10hfz'}
File "C:/Dokumente und Einstellungen/holger/Eigene Dateien/Develop/workspace/HiFreezer/build/src\m10\db\factory.py", line 59, in __getdbapi(self=<m10.db.factory.ConnectionFactory object at 0x00F29790>)
File "C:/Dokumente und Einstellungen/holger/Eigene Dateien/Develop/workspace/HiFreezer/build/src\m10\db\factory.py", line 45, in loadAdapter(self=<m10.db.factory.ConnectionFactory object at 0x00F29790>)
Local bindings:
... className = 'DbapiAdapter'
... statement = 'from m10.db.adapter.maxdb import DbapiAdapter'
File "<string>", line 1
ImportError: No module named adapter.maxdb
> <string>(1)?()
(Pdb)
Das Problem ist, ich weiss nicht, wie das Modul heisst!
Ich hoffe, Ihr könnt mir da nen Tipp geben.
Gunnar
Nachfolgend poste ich mal die Fehlermeldung:
C:\Python23\dist>hifreezer init
Traceback (most recent call last):
File "C:/Dokumente und Einstellungen/holger/Eigene Dateien/Develop/workspace/HiFreezer/build/src\m10\hfz\app.py", line 386, in main()
Local bindings:
... hfz = <m10.hfz.app.HiFreezer object at 0x009F65B0>
File "C:/Dokumente und Einstellungen/holger/Eigene Dateien/Develop/workspace/HiFreezer/build/src\m10\hfz\app.py", line 55, in start(self=<m10.hfz.app.HiFreezer object at 0x009F65B0>)
File "C:/Dokumente und Einstellungen/holger/Eigene Dateien/Develop/workspace/HiFreezer/build/src\m10\hfz\app.py", line 176, in __createComponents(self=<m10.hfz.app.HiFreezer object at 0x009F65B0>)
File "C:/Dokumente und Einstellungen/holger/Eigene Dateien/Develop/workspace/HiFreezer/build/src\m10\hfz\app.py", line 342, in __getDatabase(self=<m10.hfz.app.HiFreezer object at 0x009F65B0>)
Local bindings:
... connFactory = <m10.db.factory.ConnectionFactory object at 0x00F29790>
... database = 'MaxDB'
... dbms_adapter = 'maxdb'
... dbms_params = {'host': 'localhost', 'password': 'PHFZP', 'user': 'HFZ', 'database': 'm10hfz'}
File "C:/Dokumente und Einstellungen/holger/Eigene Dateien/Develop/workspace/HiFreezer/build/src\m10\db\factory.py", line 59, in __getdbapi(self=<m10.db.factory.ConnectionFactory object at 0x00F29790>)
File "C:/Dokumente und Einstellungen/holger/Eigene Dateien/Develop/workspace/HiFreezer/build/src\m10\db\factory.py", line 45, in loadAdapter(self=<m10.db.factory.ConnectionFactory object at 0x00F29790>)
Local bindings:
... className = 'DbapiAdapter'
... statement = 'from m10.db.adapter.maxdb import DbapiAdapter'
File "<string>", line 1
ImportError: No module named adapter.maxdb
> <string>(1)?()
(Pdb)
Das Problem ist, ich weiss nicht, wie das Modul heisst!
Ich hoffe, Ihr könnt mir da nen Tipp geben.
Gunnar
-
- User
- Beiträge: 424
- Registriert: Montag 28. Juli 2003, 16:19
- Wohnort: /dev/reality
Auf den ersten Blick würde ich sagen, da fehlt was........ className = 'DbapiAdapter'
... statement = 'from m10.db.adapter.maxdb import DbapiAdapter'
File "<string>", line 1
ImportError: No module named adapter.maxdb
Die originalen maxdb-Schnittstellen heißen immer noch sapdb(lt MySQL-Doku).
Kannst du dir mal von dem Entwickler eine Liste der Modul-Abhängigkeiten geben lassen? Interessant wäre, was wie wo importiert wird und welche Module "Standards" sind und welche selbst geschrieben.
Und die setup.cfg wäre auch interessant, vielleicht krabbelt da auch noch ein Käfer drin rum.
mfg, querdenker
Hallo querdenker,
ich hänge mal die Antwort der Entwickler an, ist aber nicht die Antwort auf die Fragen, die Du mir mitgegeben hast:
Hallo,
mir ist es so bekannt, dass wir Module auf zwei Arten laden.
1.) Direkte Importierung in der "appserive.py"
...
import m10.core.uuid
import m10.hfz.datamoverapi
import m10.db.context
import m10.db.factory
import m10.hfz.activity
...
2.) In einigen Module (außerhalb des appservice) werden ebenfalls andere Module importiert.
Z.B. wird häufig auf "m10.core."-Utility Methoden oder die "m10.core.AppError"-Exception zurückgegriffen (sowohl in "py", wie auch "y"-Dateien).
Zudem:
Im Modul "importing.py" wird das im appservice erstellt Serviceobject für den 'importWorfklow' (die ausführende Klasse) über Klassenvererbung in der 'importProvider' Klasse über den internen Namen 'self.__import' zugänglich gemacht.
So können über das Burg-Architektur-Prinzip Klassenmethode der Workflow-Klasse, aus der Provider-Klasse (nach erfolgreiche 'Benutzerprüfungen', etc.) aufgerufen werden.
Der Name 'self.__import' ist hierbei vielleicht etwas unglücklich (leicht verwechselbar) gewählt.
Ich sehe das auch wie Holger. Module werden direkt per Namen geladen. Dynamisch geladen werden meines Wissens die Datenbank-Adapter (MySQL, MaxDB).
(hifreezer.zip -> m10\db\adapter o. wenn man hat build\src\m10\db\adapter)
Meine setup.cfg sieht momentan so aus:
#distutils config-file
[py2exe]
#packages = DbapiAdapter
#no output at all
optimize=2
Gunnar
ich hänge mal die Antwort der Entwickler an, ist aber nicht die Antwort auf die Fragen, die Du mir mitgegeben hast:
Hallo,
mir ist es so bekannt, dass wir Module auf zwei Arten laden.
1.) Direkte Importierung in der "appserive.py"
...
import m10.core.uuid
import m10.hfz.datamoverapi
import m10.db.context
import m10.db.factory
import m10.hfz.activity
...
2.) In einigen Module (außerhalb des appservice) werden ebenfalls andere Module importiert.
Z.B. wird häufig auf "m10.core."-Utility Methoden oder die "m10.core.AppError"-Exception zurückgegriffen (sowohl in "py", wie auch "y"-Dateien).
Zudem:
Im Modul "importing.py" wird das im appservice erstellt Serviceobject für den 'importWorfklow' (die ausführende Klasse) über Klassenvererbung in der 'importProvider' Klasse über den internen Namen 'self.__import' zugänglich gemacht.
So können über das Burg-Architektur-Prinzip Klassenmethode der Workflow-Klasse, aus der Provider-Klasse (nach erfolgreiche 'Benutzerprüfungen', etc.) aufgerufen werden.
Der Name 'self.__import' ist hierbei vielleicht etwas unglücklich (leicht verwechselbar) gewählt.
Ich sehe das auch wie Holger. Module werden direkt per Namen geladen. Dynamisch geladen werden meines Wissens die Datenbank-Adapter (MySQL, MaxDB).
(hifreezer.zip -> m10\db\adapter o. wenn man hat build\src\m10\db\adapter)
Meine setup.cfg sieht momentan so aus:
#distutils config-file
[py2exe]
#packages = DbapiAdapter
#no output at all
optimize=2
Gunnar
-
- User
- Beiträge: 424
- Registriert: Montag 28. Juli 2003, 16:19
- Wohnort: /dev/reality
Hallo Gunnar,
wie arbeitest du jetzt? Nimmst du den Weg über die setup.cfg, oder hast du die Packages in der setup.py?
Und noch 'ne Frage: welches Python(ActiveState oder python.org)?
Und ins blaue geschossen: Ich vermute mal, das du den Pfad zu den Modulen nicht in im Python-Suchpfad hast.
Taucht da der Pfad auf, in dem deine Module liegen?
mfg, querdenker
wie arbeitest du jetzt? Nimmst du den Weg über die setup.cfg, oder hast du die Packages in der setup.py?
Und noch 'ne Frage: welches Python(ActiveState oder python.org)?
Und ins blaue geschossen: Ich vermute mal, das du den Pfad zu den Modulen nicht in im Python-Suchpfad hast.
Code: Alles auswählen
import sys
sys.path
mfg, querdenker
Ich benutze schon die setup.cfg, hatte das mit den Packages nur auskommentiert, weil es nicht funktioniert hat. (Unbekanntes Modul)
python.org -> python23
Kann sein, wüsste jetzt auch nicht, wie ich die da reinbekomme.
Nein, der Pfad ist nicht dabei.
Gunnar
python.org -> python23
Kann sein, wüsste jetzt auch nicht, wie ich die da reinbekomme.
Nein, der Pfad ist nicht dabei.
Gunnar
-
- User
- Beiträge: 424
- Registriert: Montag 28. Juli 2003, 16:19
- Wohnort: /dev/reality
Auf die Schnelle:
mfg, querdenker
Code: Alles auswählen
import sys
sys.path.append('pfad/zu/deinem/code/haufen')
#ab hier weiter mit dem 'normalen' Code
Sorry, dass ich so doof nachfrage.
Wo genau muss ich das reinschreiben, in die setup.py?
Muss ich dort den Pfad bis zu den DB Modulen angeben?
Danke
Gunnar
Wo genau muss ich das reinschreiben, in die setup.py?
Muss ich dort den Pfad bis zu den DB Modulen angeben?
Danke
Gunnar