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

如何从另一个Python脚本调用带命令行参数的Python脚本?

批量处理脚本的实现方案

方法一:使用subprocess直接调用命令行(最贴近原操作方式)

用subprocess.run()直接模拟你在命令行执行的命令,无需修改原脚本,逻辑和手动执行完全一致。

示例代码:

import os
import subprocess

def main():
    directory = "/home/pchong/work/algotick/new_lob/pass2/01"  # 替换为你的目标目录
    parser_code = "lse"  # 固定的-p参数值
    script_path = "/util/check_normalisation.py"  # 原脚本的完整路径

    for file in os.listdir(directory):
        filename = os.fsdecode(file)
        # 可添加过滤条件,比如只处理.h5格式文件
        if filename.endswith(".h5"):
            full_file_path = os.path.join(directory, filename)
            # 构造完整命令行参数
            cmd = [
                "python3",
                script_path,
                "-p", parser_code,
                full_file_path
            ]
            # 执行命令,如需捕获输出可保留capture_output参数,否则直接用subprocess.run(cmd)
            result = subprocess.run(cmd, capture_output=True, text=True)
            # 打印单个文件的处理结果
            print(f"处理文件: {filename}")
            print(f"返回状态: {result.returncode}")
            if result.stdout:
                print(f"输出: {result.stdout.strip()}")
            if result.stderr:
                print(f"错误信息: {result.stderr.strip()}")
            print("---")

if __name__ == "__main__":
    main()

方法二:导入原脚本作为模块调用(更高效)

直接调用原脚本的核心处理函数,避免重复启动Python进程,处理数千个文件时效率显著更高。

步骤1:确保原脚本可被导入

原脚本已将核心逻辑封装在do_checks函数中,且if __name__ == '__main__':块不会干扰模块导入,因此可以直接引用。

步骤2:批量处理脚本示例

import os
import sys
# 将原脚本所在目录添加到Python路径,确保能导入模块
sys.path.append("/util")
from check_normalisation import do_checks, ReturnCode

def main():
    directory = "/home/pchong/work/algotick/new_lob/pass2/01"
    parser_code = "lse"
    midnight = 0  # 原脚本默认的-m参数值

    for file in os.listdir(directory):
        filename = os.fsdecode(file)
        if filename.endswith(".h5"):
            full_file_path = os.path.join(directory, filename)
            print(f"开始处理文件: {filename}")
            # 直接调用核心处理函数
            rc = do_checks(full_file_path, midnight, parser_code)
            print(f"处理完成,状态: {rc}")
            print("---")

if __name__ == "__main__":
    main()

注意事项

  • 若原脚本中的ReturnCode是自定义枚举/类,需确保导入时能正确引用;
  • 批量脚本的运行环境需与原脚本一致,保证依赖包齐全。

额外优化建议

  • 用os.scandir()替代os.listdir(),可直接获取文件完整路径与属性,遍历效率更高;
  • 若文件数量极大,可通过concurrent.futures模块实现多进程/多线程并行处理,缩短总耗时。

内容的提问来源于stack exchange,提问作者user21641220

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 13:02:49