Python3.8中subprocess运行Windows EXE后无法自动按键结束进程如何解决?
问题根因
subprocess.run() 是阻塞调用,会等待目标EXE进程完全退出后才会返回执行后续代码。你写在run之后的模拟回车逻辑永远不会在EXE等待按键阶段触发,只有手动按按键让EXE退出后,run才会执行完毕,此时后续按键逻辑已经没有意义。
解决方案
方案一:通过标准输入传递回车(最稳定,不依赖窗口状态)
不需要调用模拟键盘库,直接给子进程的标准输入写入换行符,等价于按下回车,不会受窗口焦点影响。
import subprocess import time try: # 启动子进程,绑定标准输入管道 proc = subprocess.Popen(exe_path, stdin=subprocess.PIPE, text=True) # 等待EXE运行到等待按键阶段,时长根据你的程序实际运行耗时调整 time.sleep(3) # 传入回车符,等待进程结束 proc.communicate(input='\n', timeout=5) if proc.returncode == 0: print('Successful Extracted') except Exception as exe: print(exe.args)
方案二:非阻塞启动+模拟键盘(适用于标准输入写入无效的特殊EXE)
部分老旧EXE不会从标准输入读取按键,只能响应系统键盘事件,可使用该方案,需确保EXE窗口处于激活状态避免按键发送错位。
需要先安装依赖:pip install pygetwindow keyboard
import subprocess import time import keyboard import pygetwindow as gw try: # 非阻塞启动EXE,主进程继续执行后续逻辑 proc = subprocess.Popen(exe_path) # 等待EXE运行完成,时长根据你的程序实际运行耗时调整 time.sleep(3) # 将EXE窗口调到前台,确保按键发送到目标程序 exe_window = gw.getWindowsWithTitle("你的EXE窗口标题")[0] exe_window.activate() time.sleep(0.2) # 发送回车按键 keyboard.press_and_release('enter') # 等待进程退出 proc.wait(timeout=5) print('Successful Extracted') except Exception as exe: print(exe.args) keyboard.press_and_release('enter')
注意事项
- 代码中的
sleep时长需要根据你的EXE实际运行耗时调整,确保输入发送时EXE已经运行到Press Any Key To Exit的等待阶段。 - 优先使用方案一,兼容性和稳定性远高于模拟键盘方案。
- Python3.8完全兼容上述代码语法,无需额外调整。
内容的提问来源于stack exchange,提问作者jahmed31
相关产品推荐
相关产品推荐

