You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 21:54:04