Python使用exec/subprocess批量运行带input交互脚本的问题求助
可行实现方案
错误原因说明
你之前的方案失效核心有两个原因:
- 原脚本使用
input()从**标准输入流(stdin)**读取内容,并未读取命令行参数sys.argv,所以直接传参数给脚本完全无效 - 调用
subprocess时传入的输入内容不符合要求:原脚本需要2次输入,每次输入要以换行符结尾才会被input()识别为输入完成,你之前只传了1个输入且缺少换行符,导致程序一直等待输入阻塞或者异常退出
完整可运行代码
import os import subprocess import sys # 配置参数:遍历的目录、输入的两个值 TARGET_DIR = "." # 当前目录,可替换为你要遍历的目录路径 INPUT_PRICE = "1" INPUT_PAY = "5" # 构造标准输入内容,两次输入用换行分隔,末尾加换行确保最后一次input读取完成 stdin_content = f"{INPUT_PRICE}\n{INPUT_PAY}\n" # 遍历目录下所有.py文件,你可以修改匹配规则筛选你要运行的脚本 for filename in os.listdir(TARGET_DIR): if not filename.endswith(".py"): continue file_path = os.path.join(TARGET_DIR, filename) print(f"===== 正在运行脚本:{filename} =====") try: # 启动子进程运行脚本 proc = subprocess.Popen( [sys.executable, file_path], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, encoding="utf-8" ) # 传入输入,等待运行完成,捕获输出 stdout, stderr = proc.communicate(input=stdin_content, timeout=10) # 处理运行结果 if proc.returncode == 0: print("运行成功,输出内容:") print(stdout) # 如果需要存到文件可以取消注释下方代码 # with open(f"{filename}_output.txt", "w", encoding="utf-8") as f: # f.write(stdout) else: print(f"运行出错,错误码:{proc.returncode},错误信息:") print(stderr) except subprocess.TimeoutExpired: print(f"脚本运行超时,已强制终止") proc.kill() except Exception as e: print(f"调用异常:{str(e)}")
功能说明
- 自动遍历指定目录下所有Python脚本依次运行
- 自动传入你需要的两个输入值,无需手动操作
- 自动捕获每个脚本的正常输出和错误输出,可直接打印也可以存到本地文件
- 加入超时机制避免异常脚本一直阻塞
内容的提问来源于stack exchange,提问作者Maciek Woźniak
相关产品推荐
相关产品推荐

