使用子进程打开 exe 文件并与之交互



我正在使用Python来编写运行exe程序的脚本。 如果我们在 shell 中打开 exe 程序,我们可以在程序中输入不同的命令,例如"a"、"b"、"c"。这些命令不能作为标志传递到 exe 程序中。我想使用 Python 多次编写运行此 exe 程序的脚本,并带有自定义 exe 程序特定的输入。 但是如果我运行"程序.exe

p = subprocess.call(['program.exe'],
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
)

Python 不会终止。我可以通过 Python 中的子进程来实现这个目的吗?

注意:在子进程终止之前,subprocess.call不会返回。因此,您不可能将任何内容写入孩子的标准输入。

如果你可以提前准备一堆命令,并且如果输出没有填充系统缓冲区的风险,你仍然可以这样使用调用:

cmds = "anbncn"
p = subprocess.call(['program.exe'],
stdin=io.StringIO(cmds),
stdout=subprocess.PIPE,
)

但更健壮的方法是直接使用 Popen 构造函数,然后馈送输入:

p = subprocess.Popen(['program.exe'],
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
)
p.stdin.write("an");
p.stdin.write("bn");
...
p.stdin.close();
p.wait();

如果您知道一个子命令将生成非常大的输出,则可以在发送下一个子命令之前读取它。当心,以免在等待孩子尚未发送的输入时被阻止......

首先,您必须使用p = subprocess.Popen(…)才能获取子流程对象。subprocess.call(…)只会给你退货状态,这还不够。

如果p是连接对象,则可以将命令发送到p.stdin,例如p.stdin.write("an"),然后读出p.stdout(),直到命令输出完成的下一个指示。您如何检测这一点取决于所述程序。

然后,您可以发送下一个命令并读取其输出。

最后,您可以执行p.stdin.close()以向另一个进程发出EOF信号,然后它应该终止。

最新更新