【问题标题】:Use subprocess to open an exe file and interact with it使用子进程打开一个exe文件并与之交互
【发布时间】:2020-02-11 13:31:55
【问题描述】:

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

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

Python 不会终止。我可以在 Python 中使用 subprocess 来实现这个目的吗?

【问题讨论】:

标签: python bash shell subprocess


【解决方案1】:

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

如果您知道一个子命令会产生非常大的输出,您可以在发送下一个子命令之前阅读它。请注意避免被阻止等待孩子仍未发送的输入...

【讨论】:

  • 嗨,Serge,谢谢你帮助我。第二种方法有效,但由于某种原因,我还必须设置 bufsize=0 和 `shell=True` 。
【解决方案2】:

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

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

然后你可以发送下一个命令并读取它的输出。

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

【讨论】:

  • 感谢您帮助我。第二种方法有效,但由于某种原因,我还必须设置 bufsize=0 和 shell=True` 。
猜你喜欢
  • 1970-01-01
  • 2019-11-08
  • 2015-04-14
  • 2014-03-16
  • 2015-05-31
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 2014-07-03
相关资源
最近更新 更多