You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何动态加载文件夹下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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 23:57:06