将键盘输入传递给Windows可执行文件

4 投票
2 回答
2351 浏览
提问于 2025-04-18 06:34

我正在为一款软件创建一个Python批处理脚本,这个软件必须在C盘下以Windows可执行文件的形式运行。现在这个流程几乎搭建好了。但是在启动之前,这个可执行文件需要一些键盘输入。在我尝试传递键盘输入之前,它是可以用subprocess.call()正常工作的,但我找不到communicate()的正确用法,下面的代码就是注释掉的部分。

现在我尝试使用win32com的SendKeys(见下面的代码),但现在主脚本在可执行文件完成之前就继续执行了。对于我的代码,有什么建议吗?我能否记录可执行文件的退出状态,使用一个while循环让主进程在可执行文件完成之前先“睡一觉”?

#subprocess.call(r"C:\LTR_STRUC\LTR_STRUC_1_1.exe")
shell = win32com.client.Dispatch("WScript.shell")
Return = shell.Run(r"C:\LTR_STRUC\LTR_STRUC_1_1.exe")
time.sleep(2)
shell.AppActivate(r"C:\LTR_STRUC\LTR_STRUC_1_1.exe")
shell.SendKeys("y", 0)
shell.SendKeys("{Enter}", 0)
time.sleep(1)
shell.SendKeys("y", 0)
shell.SendKeys("{Enter}", 0)
time.sleep(1)
shell.SendKeys("{Enter}", 0)

###...and on goes the code...

如果有其他聪明的建议,我将非常感激!!

2 个回答

3

试试这个:

import os
from subprocess import Popen, PIPE
cmd = r"C:\LTR_STRUC\LTR_STRUC_1_1.exe"

app = Popen(cmd, stdin=PIPE, shell=True)
app.stdin.write("y" + os.linesep)
...

另外,如果你想对一个提示做出回应,你也可以把标准输出(stdout)通过管道传递,然后通过以下方式访问它:

app.stdout.read()

参考链接:https://docs.python.org/2/library/subprocess.html#subprocess.PIPE

0

我用Pywin模块的另一个功能解决了这个问题 - win32ui。它的工作原理和问题中提到的一样,但还多了这一点:

import win32ui

def WindowExists(windowname):
    try:
        win32ui.FindWindow(None, windowname)

    except win32ui.error:
        return False
    else:
        return True

process = True
while process == True:
    if WindowExists(r"C:\LTR_STRUC\LTR_STRUC_1_1.exe"):
        process = True
    else:
        process = False
        time.sleep(5)

基本上,这段代码是用来检查程序窗口或进程是否存在的。当窗口还在的时候,就说明程序还在运行,因此后面的代码就不会继续执行。

希望这对其他人也有帮助!

撰写回答