为Python服务实现自主开发的插件

2024-04-27 04:15:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在写一个简单的调度服务。我不想硬编码它可以安排的所有任务,而是希望支持可以放入文件夹并在运行时动态加载的插件。你知道吗

我的计划是有一个JSON文件(或任何配置文件),它将任务名称映射到Python文件(模块)的位置,Python文件将有一个名为Plugin的类。我觉得很简单。当有人计划任务运行时,他们会传递任务名称和运行时间。当时间流逝时,插件将被加载(或重新加载)并与传递给调度程序的任何附加参数一起运行。你知道吗

我一直在研究imp模块,以了解如何在运行时加载模块。我不确定是要使用插件的物理位置(文件系统路径)还是使用它们的模块名,就像您在import语句中看到的那样。似乎imp想要使用物理位置。你知道吗

我有两个不同版本的代码“工作”。这里有一个使用importlib

    pluginName = self.__pluginLookup[pluginName]
    module = import_module(pluginName)
    module = reload(module)  # force reload

    plugin = module.Plugin()
    return plugin

这是我用imp写的:

    path = self.__pluginLookup[pluginName]
    path, moduleName = split(path)
    moduleName, extension = splitext(moduleName)

    file, path, description = find_module(moduleName, [path])
    with file:
        module = load_module(moduleName, file, path, description)

    plugin = module.Plugin()
    return plugin

我遇到的问题是处理依赖项。如果我有一个plugin.py文件依赖于同一文件夹中的dependency.py文件,那么说import dependency似乎不起作用。相反,它从PYTHONPATH中查找依赖关系。你知道吗

如何使导入相对于插件本身?你知道吗


Tags: 模块文件pathimport文件夹插件调度plugin
2条回答

如果您有一个plugins目录和一个__init__.py,您可以将该目录添加到sys.path。然后里面的模块可以from . import dependency导入另一个插件。或者,如果插件本身是一个子包(即,有自己的__init__.py的目录),那么它可以from . import dep导入同一插件内的依赖项,或者from .. import dep从全局插件目录导入依赖项。在这个设置中,您甚至不需要使用imp之类的函数;您可以使用__import__函数,该函数按模块名工作。你知道吗

不过,一个可能的问题是,你说插件目录将“在当前工作目录下”。这到底是什么意思?你的意思是你希望人们能够在硬盘的任何地方添加插件,并且仍然使用它们?最好为你的应用程序设置一个中心插件目录,并将其添加到sys.path,然后告诉人们把他们的插件放在那里。你知道吗

您可以将path附加到sys.path

import sys
sys.path.append(path)

其中path是包含相关性.py. 你知道吗

相关问题 更多 >