EDIT: Ceci est Python 2.7.6 32 bits.Module importé disparaissant?
Un module que je viens de charger et de supprimer ne peut plus être trouvé lors de l'importation. Wat?
J'ai récemment utilisé un système de plugin appelé yapsy
, et il n'était pas très adapté à mon application (un robot de discussion), j'ai donc décidé d'écrire le mien.
Tout fonctionne pour la plupart, mais je rencontre un problème étrange - si je charge un module, le décharger (et supprimer toutes les références donc ce n'est pas dans sys.modules) et essayer de le charger à nouveau, importlib est incapable de le trouver.
Le code incriminé est on GitHub mais je vais aussi coller les choses pertinentes ci-dessous.
def load_plugin(self, name):
name = name.lower()
if name not in self.info_objects:
return PluginState.NotExists
if name in self.objects:
return PluginState.AlreadyLoaded
info = self.info_objects[name]
for dep in info.core.dependencies:
dep = dep.lower()
if dep not in self.objects:
return PluginState.DependencyMissing
# module = plugins.control
module = "%s.%s" % (self.module, info.module)
try:
self.log.trace("Module: %s" % module)
obj = None
if module in sys.modules:
# Always False
self.log.trace("Module exists, reloading..")
reload(sys.modules[module])
module_obj = sys.modules[module]
else:
module_obj = importlib.import_module(module)
self.log.trace("Module object: %s" % module_obj)
for name_, clazz in inspect.getmembers(module_obj):
self.log.trace("Member: %s" % name_)
if inspect.isclass(clazz):
self.log.trace("It's a class!")
if clazz.__module__ == module:
self.log.trace("It's the right module!")
for parent in clazz.__bases__:
if parent == PluginObject:
self.log.trace("It's the right subclass!")
obj = clazz()
if obj is None:
self.log.error(
"Unable to find plugin class for plugin: %s" % info.name
)
return PluginState.LoadError
self.objects[name] = obj
except ImportError:
self.log.exception("Unable to import plugin: %s" % info.name)
self.log.debug("Module: %s" % module)
return PluginState.LoadError
except Exception:
self.log.exception("Error loading plugin: %s" % info.name)
return PluginState.LoadError
else:
try:
info.module = module
info.core.module = module
info.set_plugin_object(obj)
obj.add_variables(info, self.factory_manager)
obj.logger = getLogger(info.name)
obj.setup()
except Exception:
self.log.exception("Error setting up plugin: %s" % info.name)
return PluginState.LoadError
else:
self.objects[name] = obj
return PluginState.Loaded
def unload_plugin(self, name):
name = name.lower()
if name not in self.objects:
return PluginState.NotExists
obj = self.objects[name]
self.factory_manager.commands.unregister_commands_for_owner(obj)
self.factory_manager.event_manager.remove_callbacks_for_plugin(obj)
self.factory_manager.storage.release_files(obj)
try:
obj.deactivate()
except Exception:
self.log.exception("Error deactivating plugin: %s" % obj.info.name)
del self.objects[name]
return PluginState.Unloaded
Et quelques exemples de sortie lors de l'utilisation ..
09 Sep 2014 - 09:29:39 | Commands | INFO | irc-esper | <g:#Ultros-test> .pl load control
09 Sep 2014 - 09:29:39 | irc-esper | INFO | -> *#Ultros-test* Loaded plugin: Control
09 Sep 2014 - 09:29:42 | Commands | INFO | irc-esper | <g:#Ultros-test> .pl unload control
09 Sep 2014 - 09:29:42 | irc-esper | INFO | -> *#Ultros-test* Unloaded plugin: Control
09 Sep 2014 - 09:29:43 | Commands | INFO | irc-esper | <g:#Ultros-test> .pl load control
09 Sep 2014 - 09:29:43 | Plugins | ERROR | Unable to import plugin: Control
Traceback (most recent call last):
File "E:\Ultros\Projects\Ultros\Ultros\system\plugins\manager.py", line 175, in load_plugin
module_obj = importlib.import_module(module)
File "Z:\Python\App\lib\importlib\__init__.py", line 37, in import_module
__import__(name)
ImportError: No module named plugins.control
Donc, clairement, quelque chose d'étrange se passe ici. plugins.control
existe évidemment et se charge avec succès la première fois - Il existe toujours après avoir été déchargé et essayer de charger à nouveau - donc .. Je n'ai vraiment aucune idée de ce qui se passe.
Je peux voir que le module perd toutes les références - ce que je veux - et qu'il est donc supprimé de sys.modules, mais bon, je ne comprends vraiment pas ce comportement.
Des idées?