2014-09-09 4 views
2

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?

Répondre

0

Trouvé! Après un peu de déconner, j'ai remarqué que j'avais oublié que info.module était réglé sur chaque charge de plugin, étant préfixés avec "plugins." chaque fois.

  • ->control
  • ->plugins.control
  • ->plugins.plugins.control

causant ainsi la ImportError.

Questions connexes