Pythonic方式动态加载和调用模块

时间:2017-03-30 12:16:17

标签: python plugins

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

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

目标是拥有一个可以通过一些额外功能轻松扩展的脚本。

我想出的是以下内容。在这种情况下 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不太专业,所以这是一个可以接受的解决方案吗?

0 个答案:

没有答案