我想要做的是导入目录/包中的每个模块,然后在每个子模块上调用相同的函数,而不知道它们的名称或有多少。
如果您熟悉MCEdit(Minecraft的第三方工具),其过滤系统就是这样的。所有作为过滤器的.py文件都放在一个目录中,然后MCEdit导入每个文件,并且能够显示导入过滤器的列表并执行每个执行(级别,框,选项)功能。
答案 0 :(得分:2)
找到该目录中的每个模块,使用__import__
导入它,然后调用该函数。例如:
for file_name in os.listdir('path/to/modules'):
if file_name.startswith('.') or not file_name.ends_with('.py'):
continue
module_name = file_name[:-3]
module = __import__(module_name)
module.some_function()
但是,这并不能解决所有情况 - 特别是,某些模块可能用C语言编写,并且具有.pyd
扩展名而不是.py
。你想说明这一点吗? sys.path
中可能有几个条目。您想支持所有这些,还是只搜索一个目录?模块可以驻留在ZIP文件中。你必须支持这一点。使用导入钩子,可能会动态生成模块,而可能无法枚举它们。您必须决定在搜索模块时想要走多远。但是在找到它们之后,很容易导入和使用它们。