Python获取导入子模块实例及批量调用脚本main函数方法
解决批量调用modules文件夹下脚本main()函数的问题
嘿,看起来你一开始走了点弯路——你原本想搞清楚怎么获取from module import *导入的所有子模块对象,但其实这是个典型的XY问题,你的真实需求是要批量执行modules文件夹下所有规范脚本里的main()函数对吧?那咱们直接解决核心问题就好!
先做好前置准备
首先要确保你的modules文件夹是一个合法的Python包:在文件夹里新建一个空的__init__.py文件(Python 3.3+其实可以没有,但加上兼容性更好),并且你的主脚本和modules文件夹处于同一目录下。
方法一:手动遍历文件+动态导入
这种方式直观,适合需要对文件名做额外筛选的场景:
import os import importlib # 定位modules文件夹的绝对路径 modules_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'modules') # 遍历文件夹下的所有Python脚本 for filename in os.listdir(modules_dir): # 只处理.py文件,排除__init__.py if filename.endswith('.py') and filename != '__init__.py': # 提取模块名(去掉.py后缀) module_name = filename[:-3] # 动态导入模块,注意要带上包名前缀 module = importlib.import_module(f'modules.{module_name}') # 安全调用main()函数(先检查是否存在且可调用) if hasattr(module, 'main') and callable(module.main): print(f"执行{module_name}的main函数...") module.main()
方法二:用pkgutil遍历包(更优雅)
如果你的modules包结构很规范,用pkgutil可以自动遍历所有子模块,不用手动处理文件名:
import importlib import pkgutil # 先导入modules包 import modules # 遍历modules包下的所有子模块 for finder, module_name, is_package in pkgutil.walk_packages(modules.__path__, modules.__name__ + '.'): # 动态导入子模块 module = importlib.import_module(module_name) # 安全调用main函数 if hasattr(module, 'main') and callable(module.main): print(f"执行{module_name.split('.')[-1]}的main函数...") module.main()
为什么不推荐用from module import *?
顺便解释下你最初思路的问题:
from module import *会把模块内所有非下划线开头的名字导入当前命名空间,但这些名字可能是函数、变量、类,不一定是子模块;而且就算有子模块,你也很难精准筛选出所有模块对象,还容易引发命名冲突,完全没必要绕这个弯子~
内容的提问来源于stack exchange,提问作者dacefa




