我想知道我的文件夹中是否包含一些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] 删除。
我来说两句