首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为Python服务实现自制插件

为Python服务实现自制插件
EN

Stack Overflow用户
提问于 2012-09-09 09:38:16
回答 2查看 83关注 0票数 1

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

我的计划是创建一个JSON文件(或任何配置文件),将任务名称映射到Python文件(模块)的位置,该文件将有一个名为Plugin的类。我觉得很简单。当有人计划运行任务时,他们会传递任务名称和运行该任务的时间。当时间过去时,插件被加载(或重新加载),并使用传递给调度器的任何附加参数运行。

我一直在研究imp模块,以了解如何在运行时加载模块。我不确定是使用插件的物理位置(文件系统路径)列出插件,还是像在import语句中看到的那样使用模块名称。看起来imp想要使用物理位置。

我得到了这个代码的两个不同版本的“工作”。下面是一个使用importlib的应用程序

代码语言:javascript
复制
    pluginName = self.__pluginLookup[pluginName]
    module = import_module(pluginName)
    module = reload(module)  # force reload

    plugin = module.Plugin()
    return plugin

这是我用imp写的

代码语言:javascript
复制
    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

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

我如何才能使导入相对于插件本身?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-09 10:13:31

您可以将path附加到sys.path

代码语言:javascript
复制
import sys
sys.path.append(path)

其中,path是包含dependency.py的目录。

票数 2
EN

Stack Overflow用户

发布于 2012-09-09 10:35:45

如果您有一个包含__init__.pyplugins目录,则可以将该目录添加到sys.path。然后里面的模块可以执行from . import dependency来导入另一个插件。或者,如果插件本身是一个子包(即具有自己的__init__.py的目录),那么它可以执行from . import dep来导入同一插件中的依赖项,或者执行from .. import dep来从全局插件目录中导入依赖项。使用这种设置,您甚至不需要使用imp或类似的东西;您可以使用__import__函数,该函数按模块名称工作。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12335890

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档