如何从另一个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
相关产品推荐
相关产品推荐

