Seite 1 von 1

Dynamisches Moduleladen - wie am besten?

Verfasst: Sonntag 22. Januar 2012, 14:13
von theliquidwave
Hallo,
ich versuche gerade, Module dynamisch zu laden.
Die Module befinden sich im Ordner "modules".
Wenn man beispielsweise "test_module" als Parameter übergibt, heißt die Datei "test_module.py" und die Klasse, die automatisch instanziert wird, heißt "TestModule".
Hier ist erstmal mein Code:

Code: Alles auswählen

	def load_module(self, name):
		name = name.lower()
		parts = name.split("_")
		classname = ""
		
		for part in parts:
			classname += part.title()
		
		try:
			if name in self.pastmodules:
				module = reload(sys.modules["modules." + name])
			else:
				module = getattr(__import__("modules." + name), name)
				self.pastmodules.append(name)
			
			self.modules[name] = getattr(module, classname)(self)
			
			return True
		except Exception, e:
			print e
			pass
		
		return False
	
	def unload_module(self, name):
		if name in self.modules:
			del self.modules[name]
			del sys.modules["modules." + name]
			
			return True
		
		return False
Ich bin aber nicht ganz zufrieden damit.
Wenn ein Fehler beim Laden auftritt, wird keine Exception ausgegeben, obwohl ich "print e" benutze. Selbst wenn diese ausgegeben würde, wäre es nur eine Zeile.
Wie kriege ich es also hin, dass ich den kompletten Traceback bekomme? Ich habe schon mit dem traceback-Module herumgespielt. Allerdings kriege ich es nicht hin, denn ich möchte die Exception trotzdem abfangen. Ergo: Die Exception soll vollständig mit Traceback ausgeeben werden, und dennoch soll die Exception abgefangen werden (so, dass das Programm sich nicht beendet).

Hat dazu jemand eine Idee?

Gruß und vielen Dank!

Re: Dynamisches Moduleladen - wie am besten?

Verfasst: Montag 23. Januar 2012, 10:48
von deets
sys.exc_info() ist dein Freund.

Re: Dynamisches Moduleladen - wie am besten?

Verfasst: Montag 23. Januar 2012, 14:49
von Dav1d
Ich habe mir für meinen IRC-Bot ein Plugin-System geschrieben: http://paste.pocoo.org/show/539251/, welches "Plugins" dynamisch lädt und wieder "neu laden". Es wird das imp-Modul zum Laden verwendet, außerdem ist es in Anlehnung an zine entstanden. Kannst dich an dem Code orientieren oder ihn einfach komplett übernehmen.

//Edit: Fehler in unload_plugins behoben