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에서 제거되고 있지만 실제로이 동작을 이해하지 못합니다.
아이디어가 있으십니까?