如何用Python自动执行需分步输入的CMD程序program.exe?
解决program.exe自动化输入与重复执行问题
为啥你原来的代码没用?
你用Start cmd /k会新开一个独立的CMD窗口,Python脚本根本没法控制这个窗口的输入,所以后面的Input 1这些命令完全传不到program.exe里,自然没效果。
正确实现代码(基础版)
直接启动program.exe,用subprocess的管道给它传输入,一次性把三个输入按顺序发过去:
import subprocess import time def run_program(): # 直接启动program.exe,不要嵌套CMD proc = subprocess.Popen( "program.exe", stdin=subprocess.PIPE, # 允许给程序发输入 stdout=subprocess.PIPE, # 可选,捕获程序输出 stderr=subprocess.PIPE, # 可选,捕获错误信息 text=False # 字节模式,新手先保持这个设置 ) # 把三个输入按顺序拼接,每个输入后跟换行符(模拟按回车) input_content = b"1\n2\n3\n" # 发送输入,等待程序执行完毕 stdout, stderr = proc.communicate(input=input_content) # 调试用:打印输出和错误(Windows CMD默认编码是gbk,按需调整) print("程序输出:", stdout.decode("gbk")) print("错误信息:", stderr.decode("gbk")) # 检查程序是否正常退出 print(f"程序返回码: {proc.returncode}") # 重复执行示例,比如跑3次 for _ in range(3): run_program() time.sleep(1) # 可选,等待文件写入完成
关于communicate方法
这个方法就是帮你做三件事:
- 把你传的
input内容全部发给子进程的标准输入 - 等待子进程完全结束
- 返回程序的输出和错误信息
它比自己手动写stdin.write更稳妥,能避免输入缓冲导致的问题。
进阶场景:程序有处理延迟
如果program.exe在输入2之后需要花时间写入CSV,这时候一次性发三个输入可能会出错,就得分步发,加等待时间:
import subprocess import time def run_program_with_delay(): proc = subprocess.Popen( "program.exe", stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, # 字符串模式,不用加b前缀 encoding="gbk" ) # 输入1,然后刷新缓冲区(确保程序能收到) proc.stdin.write("1\n") proc.stdin.flush() time.sleep(1) # 等待程序处理输入1 # 输入2 proc.stdin.write("2\n") proc.stdin.flush() time.sleep(5) # 等待程序写入CSV,时间按需调整 # 输入3终止程序 proc.stdin.write("3\n") proc.stdin.flush() # 等待程序结束,获取输出 stdout, stderr = proc.communicate() print("输出:", stdout) print("错误:", stderr) # 重复执行 for _ in range(3): run_program_with_delay()
注意事项
- 确保program.exe的路径正确,如果不在当前脚本目录,要写绝对路径,比如
"C:\\path\\to\\program.exe" - Windows下编码一般用gbk,如果程序输出是其他编码,要对应调整decode的参数
- 循环次数和等待时间根据你的实际需求修改
内容的提问来源于stack exchange,提问作者Fish
相关产品推荐
相关产品推荐

