动态加载和调用模块的Pythonic方法

动态加载和调用模块的Pythonic方法,python,plugins,Python,Plugins,我有一个工作代码,但我想知道什么是正确的Pythonic方法 我的目标是:有一个“插件”目录(每个插件一个模块),在程序运行时动态加载。所有模块都将定义一个函数,该函数将充当“入口点” 其目的是要有一个脚本,它可以通过一些额外的功能轻松扩展 我得出的结论如下reporter=plugin import os import importlib import reporters # Package, where plugins (reporters) will reside def find_

我有一个工作代码,但我想知道什么是正确的Pythonic方法

我的目标是:有一个“插件”目录(每个插件一个模块),在程序运行时动态加载。所有模块都将定义一个函数,该函数将充当“入口点”

其目的是要有一个脚本,它可以通过一些额外的功能轻松扩展

我得出的结论如下<在本例中,strong>reporter=plugin

import os
import importlib
import reporters  # Package, where plugins (reporters) will reside


def find_reporters():
    # Find all modules in directory "reporters" which look like "*_reporter.py"
    reporters = [rep.rsplit('.py', 1)[0] for rep in os.listdir('reporters') if rep.endswith('_reporter.py')]

    functions = []
    for reporter in reporters:
        module = importlib.import_module('.' + reporter, 'reporters')
        try:
            func = getattr(module, 'entry_function') # Read the entry_function if present
            functions.append(func) # Add the function to the list to be returned
        except AttributeError as e:
            print(e)

    return functions


def main():
    funcs = find_reporters()
    for func in funcs:
        func()  # Execute all collected functions

我对Python不太熟悉,所以这是一个可以接受的解决方案吗?

可能是问这个问题的合适地方!我想会有用的。尽管您希望考虑以后如何处理版本控制。您还可以使用
@register
类型的装饰器,这样导入模块将自动填充插件注册表。@AbijithMg谢谢!我不知道这个页面。@spectras你是说每个插件都会从主程序导入decorator,然后在它们的函数中使用它,它们就会被“注册”?@MartinMelka>这就是我的意思。Django的某些部分是这样工作的。自定义模板标记,如果我的内存没有问题。因此,主程序只需
导入\u模块
,然后查看插件注册表中显示的内容。它避免了定义特定入口点名称的需要,并且如果有意义的话,它允许在同一个python模块中进行多个扩展。