我正在开发一个插件系统,插件模块的加载方式如下:
def load_plugins():
plugins=glob.glob("plugins/*.py")
instances=[]
for p in plugins:
try:
name=p.split("/")[-1]
name=name.split(".py")[0]
log.debug("Possible plugin: %s", name)
f, file, desc=imp.find_module(name, ["plugins"])
plugin=imp.load_module('plugins.'+name, f, file, desc)
getattr(plugin, "__init__")(log)
instances=instances+plugin.get_instances()
except Exception as e:
log.info("Failed to load plugin: "+str(p))
log.info("Error: %s " % (e))
log.info(traceback.format_exc(e))
return instances
代码有效,但是对于插件代码中的每个导入语句,我都会收到如下警告:
plugins/plugin.py:2: RuntimeWarning: Parent module 'plugins' not found while handling absolute import
import os
主程序代码无报错,插件正常运行。
有人可以解释警告的含义以及我做错了什么。我是否需要单独创建一个空的插件模块并导入它以保持 python 快乐?
最佳答案
如果 plugins 目录没有 __init__.py
,它就不是一个包,所以当你创建 plugins.whatever
时,Python 会警告你这样一个事情不应该真的存在。 (无论你的路径是什么,“import plugins.whatever
”都无法创建它。)
还有,
- 不要在
/
上拆分,这是不可移植的。使用os.path.split
。 - 不要使用
.split(".py")
来获取没有扩展名的名称,这是错误的。使用os.path.splitext
。 - 不要将
getattr
与字符串文字一起使用。getattr(plugin, "__init__")
拼写为plugin.__init__
。 - 我很困惑你为什么要调用模块级的
__init__
函数。这似乎不对。也许您想要一个“set_logger”函数或更好的函数来实例化一个接受记录器的类。 - 不要使用
L = L + some_other_list
来扩展列表,使用extend
方法,性能更好,更地道。 - 不要通过
except Exception
压制未知异常。如果您无法计划对异常做出理智的 react ,那么您的程序就无法理智地进行。
关于python - Python 2.6 中的动态类加载 : RuntimeWarning: Parent module 'plugins' not found while handling absolute import,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2267984/