p2exe und dynamisch geladene Module

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
Gast

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
querdenker
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:

Code: Alles auswählen

# setup.py
from distutils.core import setup
import py2exe
    
setup(name="starter",
    console=["starter.py"],

    )
dazu im selben Verzeichnis die setup.cfg:

Code: Alles auswählen

#distutils config-file
[py2exe]
packages = kinterbasdb, mx.DateTime

#no output at all
optimize=2
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

Code: Alles auswählen

python setup.py py2exe
aus der Kommandozeile aufrufen.

ansonsten hilft auch die py2exe-Homepage
weiter.

mfg, querdenker
Gast

Ok, danke, dann werde ich das mal mit einer setup.cfg probieren.

Gruß
Gunnar
Gast

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
Leonidas
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
Gast

Super, es funktioniert.

Danke an alle, die mir geholfen haben.

Gruß
Gunnar
Gast

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
querdenker
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.:

Code: Alles auswählen

packages=mod1,mod2,mod3,mod4,.....,letztes_mod
Wenn du nur die Setup.py benutzt, setzt du sie wie folgt:

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']
              }
          }
      )
Hoffe das jetzt auf die schnelle richtig gemacht zu haben.

mfg, querdenker
GunnarS
User
Beiträge: 6
Registriert: Dienstag 22. März 2005, 14:17

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
querdenker
User
Beiträge: 424
Registriert: Montag 28. Juli 2003, 16:19
Wohnort: /dev/reality

... className = 'DbapiAdapter'
... statement = 'from m10.db.adapter.maxdb import DbapiAdapter'
File "<string>", line 1
ImportError: No module named adapter.maxdb
Auf den ersten Blick würde ich sagen, da fehlt was.....
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
Gast

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
querdenker
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.

Code: Alles auswählen

import sys
sys.path
Taucht da der Pfad auf, in dem deine Module liegen?

mfg, querdenker
Gast

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
querdenker
User
Beiträge: 424
Registriert: Montag 28. Juli 2003, 16:19
Wohnort: /dev/reality

Auf die Schnelle:

Code: Alles auswählen

import sys
sys.path.append('pfad/zu/deinem/code/haufen')

#ab hier weiter mit dem 'normalen' Code 
mfg, querdenker
Gast

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
GunnarS
User
Beiträge: 6
Registriert: Dienstag 22. März 2005, 14:17

Die letzte Frage hat sich erledigt.
Antworten