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

问题描述 投票:1回答:2

我正在使用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中的子流程达到此目的吗?

python bash shell subprocess
2个回答
2
投票

注意: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();

如果知道一个子命令将产生很大的输出,则可以在发送下一个命令之前先阅读它。小心避免被阻止等待孩子仍未发送的输入...


2
投票

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

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

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

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


0
投票

您可以简单地使用os.system。

command = "program.exe -a <> -b <>"
os.system(command)
© www.soinside.com 2019 - 2024. All rights reserved.