
Als kleines Fun-Projekt arbeite ich ein bisschen an einem IRC-Bot herum. Die einzelnen Funktionen sind recht klein, aber dafür gibt es relativ viele und ich will als Endziel eigentlich den User selbst schnell und ohne besondere Python-Kenntnisse neue Funktionen hinzufügen lassen.
Fürs Erste würds mir aber schon genügen, wenn ich nicht jedesmal, wenn ich eine winzige Funktion ändere den ganzen Bot neu starten müsste mit Verbindung zum Server und allem. Ich dachte daher daran, die .py Dateien mit den Befehlsfunktionen als Module zu importieren und neu zu importieren, wenn ich was geändert habe. Bisher funktioniert das allerdings noch nicht :s
Ich häng einfach mal ein paar Code-Zeilen meines Versuchs an:
Code: Alles auswählen
def load_module(self,name):
try:
exec 'import '+name
exec 'dmerge('+name+'.commands,self.commands)'
print self.commands
return 'Loading '+name+' successful'
except:
return 'Error loading module'
def unload_module(self,name):
try:
exec 'import '+name
exec 'dunmerge('+name+'.commands,self.commands)'
exec 'del '+name
print self.commands
return 'Unloading '+name+' successful'
except:
return 'Error unloading module'
Die Idee ist, das mit name bezeichnete Modul zu importieren und mittels der von mir definierten Funktion dmerge(dictionary1,dictionary2) Befehlslisten des Bots (self.commands) und des Moduls zu vereinigen. Dabei sind die dictionaries von der Form {'say':cmd_say}, wobei cmd_say eine Funktion ist.
Unload soll die Befehlsliste wieder entfernen und sollte eigentlich das Modul 'unimportieren'.
Der erste Teil funktioniert auch gar nicht so schlecht - ich kann das Programm starten und später eine beliebige Datei mit Definitionen dazuladen. Der zweite Teil scheint jedoch nicht richtig zu funktionieren - wenn ich einmal Unload und wieder Load aufrufe, hab ich wieder die alten Funktionen, Änderungen seit dem ersten Load Aufruf sind nicht berücksichtigt.
Um es auf den Punkt zu bringen:
1. Kennt jemand eine elegantere Methode, zur Laufzeit definierte Module zu laden?
2. Falls das allein das Problem nicht behebt, was könnte ich tun um das angestrebte Verhalten zu erreichen?
3. Irgendwelche sonstigen Tipps?
Danke
