如何动态加载文件夹下Python文件并统一调用指定函数传入DataFrame?
动态加载Python脚本实现方案
完全可行,你可以通过Python自带的importlib模块结合目录遍历实现动态加载脚本,无需提前硬编码脚本名称,自动生成_scripts变量。
实现前提
- 确保
scripts文件夹是合法Python包,即文件夹下存在空的__init__.py文件 - 所有业务脚本均放在
scripts目录下,文件名符合Python模块命名规范(无特殊字符、空格,不能以数字开头) - 每个业务脚本都按约定实现
TableToLoad()和Invoke()两个方法
具体实现代码
替换你原来的硬编码导入和_scripts定义部分即可,原有Invoke、GetTable逻辑无需修改:
#!/usr/bin/python import os import importlib import pandas as pd # 动态加载scripts目录下所有脚本生成_scripts字典 _scripts = {} scripts_dir = os.path.join(os.path.dirname(__file__), 'scripts') # 遍历scripts目录下所有.py文件 for filename in os.listdir(scripts_dir): # 跳过__init__.py和非Python文件 if filename.endswith('.py') and filename != '__init__.py': # 提取模块名(去掉.py后缀) module_name = filename[:-3] # 动态导入模块 module = importlib.import_module(f'scripts.{module_name}') # 存入字典,key可自定义,此处直接用文件名作为调用标识 _scripts[module_name] = module def Invoke(DB, script, parameters): if script in _scripts: curScript = _scripts[script] tables = GetTable(DB, curScript) result = curScript.Invoke(tables) return result def GetTable(DB, script): tables = script.TableToLoad() dataframes = {} if not isinstance(tables, list): tables = [tables] for table in tables: dataframes[table] = DB.LoadDataframe(table) return dataframes
优化建议
- 可增加异常捕获逻辑,处理模块导入失败、脚本未实现约定方法的场景,避免整体程序崩溃
- 如果需要自定义
_scripts的key(不用文件名作为调用标识),可以在每个脚本里加个SCRIPT_NAME常量,导入时读取该常量作为字典key - 可添加脚本过滤逻辑,只加载符合特定命名规则的脚本,避免加载测试用的临时脚本
内容的提问来源于stack exchange,提问作者Bill Software Engineer
相关产品推荐
相关产品推荐

