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

4
我正在创建一个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

这个链接讲解了Python中subprocess模块的PIPE常量。PIPE常量可以在创建子进程时被用作标准输入、输出或错误管道。多个子进程可以通过PIPE传递数据,从而使得它们之间能够通信。在处理IT技术相关内容时,使用subprocess.PIPE可以方便地进行数据流转换和处理操作。

谢谢您的回复。不幸的是,没有成功。可执行文件立即停止响应并导致管道崩溃。此外,我正在批处理中运行此程序,因此程序的运行在“for”循环内部 - 这样做不会使脚本的其余部分等待,并且它尝试为要处理的每个序列启动。 (但如果只有一个序列,它也会失败)。如果我可以暂停脚本的其余部分,则我问题中的代码将起作用... - asmason

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)

本质上,这个测试是为了检测可执行窗口/进程的存在。只要窗口存在,你就知道程序仍在运行,因此脚本的其余部分不会继续执行。

希望这对其他人在某些时候有所帮助!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接