2014-09-09 5 views
2

EDIT : 이것은 Python 2.7.6 32 비트입니다.가져온 모듈이 사라 집니까?

지금 가져 와서 삭제 한 모듈을 가져올 때 찾을 수 없습니다. 와트?

저는 최근에 yapsy이라는 플러그인 시스템을 사용하고 있으며 내 응용 프로그램 (채팅 봇)에 적합하지 않았기 때문에 직접 작성하기로했습니다.

모든 것이 잘 작동하지만, 이상한 문제가 생깁니다. 모듈을로드하고 언로드하면 (그리고 모든 참조가 삭제되어 sys.modules에 없기 때문에) 다시로드하려고 시도합니다. importlib 그것을 (를) 찾을 수 없습니다.

문제 코드는 on GitHub이지만 관련 자료도 아래에 붙여 넣습니다.

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 

그리고 몇 가지 예를 출력 할 때 사용 ..

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 

그래서, 분명히 뭔가 이상한 여기에 것입니다. plugins.control은 분명히 존재하며 처음 성공적으로로드됩니다. 언로드 된 후 다시로드를 시도한 후에도 여전히 존재합니다. 그래서 ... 실제로 무슨 일이 일어나는지 전혀 모르겠습니다.

모듈이 모든 참조를 잃어 버리고 있다는 것을 알 수 있습니다. 이것은 내가 원하는 것입니다. 그리고 sys.modules에서 제거되고 있지만 실제로이 동작을 이해하지 못합니다.

아이디어가 있으십니까?

답변

0

발견!

뒤죽박죽이되어 버린 후 각 플러그로드에 info.module이 놓여 있다는 것을 간과 한 것을 발견했습니다. 접두사는 매번 "plugins."입니다.

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

따라서 ImportError를 원인.

관련 문제