Python调用Windows控制台程序如何自动发送按键跳过按任意键继续提示
解决方案
问题根源
你之前的方案失效是因为调用控制台程序时用了阻塞式调用(比如默认参数的subprocess.run()),Python会一直等待控制台程序运行结束才会执行后续的按键代码,自然无法在提示出现时及时触发。
推荐方案:直接向子进程标准输入写入字符(最稳定)
不需要模拟全局按键,直接捕获子进程的输出,检测到目标提示后往子进程的标准输入写入任意字符即可,不受窗口激活状态影响:
import subprocess import random import time # 替换为实际的控制台程序路径 app_path = "your_app.exe" # 以非阻塞模式创建子进程,绑定标准输入、输出、错误流 proc = subprocess.Popen( app_path, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, # 合并错误流到输出流统一捕获 text=True, encoding="gbk" # Windows控制台默认编码为GBK,部分程序可能用UTF-8,按需调整 ) # 实时读取程序输出 while True: try: output = proc.stdout.readline() except: output = "" # 进程已退出则终止循环 if output == "" and proc.poll() is not None: break if output: # 可选:打印程序输出方便调试 print(output.strip()) # 检测到目标提示 if "Press any key to continue" in output: # 生成随机可打印字符写入标准输入 random_key = chr(random.randint(32, 126)) proc.stdin.write(random_key + "\n") proc.stdin.flush() # 等待程序处理完成后退出 time.sleep(0.5) break # 清理进程资源 proc.wait() proc.stdin.close() proc.stdout.close()
备选方案:模拟全局按键(仅适用于程序窗口始终在前台的场景)
如果目标程序不接受标准输入写入,必须用模拟按键的方式,需要将子进程运行和按键检测逻辑分离:
import subprocess import pyautogui import random import threading import time # 替换为实际的控制台程序路径 app_path = "your_app.exe" prompt_detected = False def monitor_and_press(): global prompt_detected # 可替换为窗口标题检测、输出内容检测逻辑,确认提示已弹出 time.sleep(1) # 按需调整等待时间 if not prompt_detected: # 可额外加窗口激活逻辑,确保按键发送到目标程序 pyautogui.press(chr(random.randint(32, 126))) prompt_detected = True # 启动后台监控线程 threading.Thread(target=monitor_and_press, daemon=True).start() # 运行目标控制台程序 subprocess.run(app_path)
注意事项
- 若控制台程序编码不是GBK,需要将
subprocess.Popen的encoding参数调整为对应编码(比如utf-8) - 部分加壳的第三方控制台程序可能直接读取硬件输入,不响应标准输入,此时只能用模拟按键方案
内容的提问来源于stack exchange,提问作者SS Hegde
相关产品推荐
相关产品推荐

