我正在使用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信号,然后它应该终止。