python - Python 2.6 中的动态类加载 : RuntimeWarning: Parent module 'plugins' not found while handling absolute import

标签 python plugins import dynamic-class-loaders

我正在开发一个插件系统,插件模块的加载方式如下:

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/

相关文章:

mysql - 如何在每次更新后转储 MySql 数据库?

r - 打开shapefile时出错

python - 无法在 Python (Windows 10) 中使用 OpenCV 打开保存的视频

Python - 正则表达式获取括号之间的数字

python - 在 django 主页 url 中传递一个 id

video - 用 flutter 捕捉视频

python - 在另一个程序/脚本中实时使用 Sysinternals Process Monitor 的输出

plugins - 在 Centreon 上安装 Nagios 插件

wordpress - wordpress 的 Multi-Tenancy 插件

Typescript:使用导入时 Intellisense 找不到绝对路径