Seite 1 von 1

Dynamisches laden von Modulen und instanziieren von Klassen

Verfasst: Montag 5. Dezember 2005, 15:19
von eccSyn
Hallo,

ich habe eine funktion geschrieben, um module automatisiert nachzuladen und automatisch unique instanzen (Singletons) zu erstellen, die dann zurückgegeben werden. Dies ist nötig, weil ich parser als plugins anbieten möchte.
Das ganze funktioniert auch wunderbar, einzig py2exe will nicht wirklich verstehen, was das soll :-)

2 Fragen.
- Gibt es eine bessere Möglichkeit, dynamisch module zu includen (incl. pfad)
- Wie überede ich py2exe dazu, die dynamisch includeten module mitzunehmen?

Vielleicht mache ich mir das alles zu umständlich.

hier mein script

Code: Alles auswählen

	def getEccObjByModuleName(self, module_name):
		if not self.EccModule.has_key(module_name):
			path = os.path.split(module_name)
			if path[1]:
				sys.path.append(path[0])
				module_name = path[1]
			
			self.EccModule[module_name] = __import__(module_name, locals(), False)
			self.EccObj[module_name] = self.EccModule[module_name].Parser(self)
			return self.EccObj[module_name]
		else:
			return self.EccObj[module_name]
Gruß,
Andreas
eccSyn :?:

Edit (Leonidas): Code in Python-Tags gesetzt.

Ideen?

Verfasst: Montag 5. Dezember 2005, 18:41
von eccSyn
Hat keiner eine Idee?

Verfasst: Montag 5. Dezember 2005, 18:49
von mitsuhiko
afaik gar nicht. du könntest sie manuell in das py2exe verzeichniss kopieren oder sowas.

Verfasst: Montag 5. Dezember 2005, 19:31
von Leonidas
Sieh dir mal What's On Air an (ggf. auch die SVN-Version), dort siehst du wie ich es gelöst habe. Ich habe einen Plugin-Loader und py2exe funktioniert damit auch (das Windows-Setup nutzt eine von py2exe generierte EXE).

Verfasst: Montag 5. Dezember 2005, 19:49
von Gast
blackbird hat geschrieben:du könntest sie manuell in das py2exe verzeichniss kopieren
Hi,

das funktioniert auch... ist nur ein wenig aufwendig (aber sicherlich nicht zu aufwendig).

Ein code-snipplet, wie ich soetwas besser implementieren kann habt ihr nicht, oder?

Gruß

Verfasst: Montag 5. Dezember 2005, 20:56
von Buell
also mit der py2exe kann ich dir nicht weiter helfen, würde mich aber auch interessieren, da das bei mir auch bald ansteht (wenn alles fertig ist)

mit dem dyn import verstehe ich dein Problem nicht so ganz, du kannst doch den Pfad direkt mit angeben, also ich würde das in etwas so schreiben:

Beispiel:
Hauptmodul
---Unterverzeichnis
------Unterunterverzeichnis
---------modul.py

__import__(unterverzeichnis+"."+Unterunterverzeichnis, globals(), locals(), Unterunterverzeichnis)

Voraussetzung dafür ist, dass im Unterverzeichnis eine __init__.py mit Inhalt:
from Unterunterverzeichnis import *
und im Unterunterverzeichnis ein __init__.py mit
from modul import *
enthalten sein. Das gleiche sollte auch über mehr als 2 Ebenen funktionieren.

Verfasst: Dienstag 6. Dezember 2005, 10:11
von Gast
Buell hat geschrieben:mit dem dyn import verstehe ich dein Problem nicht so ganz, du kannst doch den Pfad direkt mit angeben, also ich würde das in etwas so schreiben:

Beispiel:
Hauptmodul
---Unterverzeichnis
------Unterunterverzeichnis
---------modul.py

__import__(unterverzeichnis+"."+Unterunterverzeichnis, globals(), locals(), Unterunterverzeichnis)

Hmm, wenn ich das so machen würde, könnte man aber alle möglichen und unmöglichen files mit includen, oder? Ich dachte an eine Config, die nur module aus dieser aus einem verzeichnis includet.

z.B. cfg = {
'txt' : (r'modules/plugins/handle_txt', 'stable'),
'pdf' : (r'modules/plugins/handle_pdf', 'unstable'),
}
oder so ähnlich.

Wenn nun das handle_txt-modul benötigt wird, so wird auch nur das includet. Danach bleibt es im speicher. Wird ein modul garnicht benötigt, wird es auch nicht imported. Macht für mich viel sinn, wenn es 20 oder 30 plugins gibt. Die Plugins werden nur includet, wenn ein file gefunden wurde, das dieses Plugin benötigt.

Vielleicht macht das die sache klarer, vielleicht auch nicht :-)

Gruß,
Andreas
eccSyn

Verfasst: Dienstag 6. Dezember 2005, 11:10
von jens
Also in PyLucid stand ich vor dem selben Problem.
Also erstmal wird aus der Seite die PyLucid-Tags herrausgesucht. Diese Tags geben den Modulenamen an. Dann wird danach gesucht und wenn vorhanden das Modul importiert und "ausgeführt", das Ergebniss dann in die Seite eingebaut.

In dem zusammenhang interessant:
http://www.python-forum.de/viewtopic.php?t=4173
http://www.python-forum.de/viewtopic.php?t=3129
http://www.python-forum.de/viewtopic.php?t=2298