Dynamisches laden von Modulen und instanziieren von Klassen

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
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.
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

afaik gar nicht. du könntest sie manuell in das py2exe verzeichniss kopieren oder sowas.
TUFKAB – the user formerly known as blackbird
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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).
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
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ß
Buell
User
Beiträge: 90
Registriert: Samstag 29. Oktober 2005, 14:17

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.
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
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten