我正在使用Python编写脚本来运行exe程序。如果在外壳中打开exe程序,则可以在程序中输入不同的命令,例如“ a”,“ b”,“ c”。这些命令不能作为标志传递到exe程序中。我想使用Python编写脚本多次运行此exe程序,并使用自定义exe程序特定的输入。但是,如果我使用
运行“ program.exe”p = subprocess.call(['program.exe'],
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
)
Python不会终止。我可以使用Python中的子流程达到此目的吗?
注意:subprocess.call
在子进程终止之前不会返回。因此,您不可能将任何内容写入孩子的标准输入。
如果可以提前准备好一堆命令,并且如果输出没有充满系统缓冲区的风险,则仍然可以使用call来实现:
cmds = "a\nb\nc\n"
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("a\n");
p.stdin.write("b\n");
...
p.stdin.close();
p.wait();
如果知道一个子命令将产生很大的输出,则可以在发送下一个命令之前先阅读它。小心避免被阻止等待孩子仍未发送的输入...
首先,您必须使用p = subprocess.Popen(…)
才能获取子流程对象。 subprocess.call(…)
仅会给您返回状态,这还不够。
如果p
是您的连接对象,则可以将命令发送到p.stdin
,例如p.stdin.write("a\n")
,然后读出p.stdout()
,直到下一个指示命令输出完成的指示。您如何检测到此取决于上述程序。
然后,您可以发送下一条命令并读取其输出。
最后,您可以执行p.stdin.close()
以向其他进程发出EOF信号,然后它应该终止。
您可以简单地使用os.system。
command = "program.exe -a <> -b <>"
os.system(command)