从python文件列表动态加载对象

用户名

我想知道我的文件夹中是否包含一些python脚本,这些脚本具有相同的功能,例如方法名,但是可以动态导入不同的功能。这些python脚本将放在一个文件夹中,但我不知道它们将是多少。我想在文件夹中查找脚本,获取脚本列表并为每个脚本创建对象。

阿巴内特

您所描述的是通常所说的插件系统

对于Python 3.4和更高版本,有一个用于导入源文件的标准配方

剩下要做的唯一事情是(a)枚举指定目录中的所有源文件,以及(b)在加载每个模块后调用每个模块上的某些factory / register / what函数。

所以:

def load_module(path):
    name = os.path.split(path)[-1]
    spec = importlib.util.spec_from_file_location(name, path)
    module = importlib.util.module_from_spec(spec)
    spec.loader.exec_module(module)
    return module

plugins = []
for fname in os.listdir(PLUGIN_DIR):
    if not fname.startswith('.') and fname.endswith('.py'):
        try:
            module = load_module(os.path.join(PLUGIN_DIR, fname)
            plugins.append(module.plugin_factory())

plugin_factory仅仅是一个函数或类“创建对象”为每个模块。您可以随便叫它。通常,每个插件都提供一个类,该类是您定义的某种类型的子类(或鸭子类型),或者提供一个函数来返回您定义的某种类的实例。但是在非常简单的情况下,您可以仅将模块本身用作插件对象。当然,在这种情况下,最后一行变为plugins.append(module)

显然,如果您想按名称访问插件,而不仅仅是对其进行迭代(并且它们没有某些name属性),则需要将它们存储在字典中而不是列表中。

当然,您可以将它们添加到中sys.modules,如文档中的配方中所述,但通常不需要。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章