如何判断使用子进程打开的 exe 是否已完成启动?

How can I tell if an exe opened with subprocess has finished launching?

我有一个使用子进程打开 .exe 的脚本。我想知道是否有一种方法可以判断 .exe 何时完成启动?

我正在寻找类似的东西:

import subprocess

subprocess.Popen(['myFile.exe'])

While myFile.exe is still opening:

    # still loading, do nothing

print("exe finished opening")

我已经找到了检查 .exe 文件是否已被用户关闭的方法,但这不是我想要的。

谢谢!

如果您不必使用subprocess.Popen,建议使用subprocess.run代替。如果您改用 run,则 python 脚本会等到 run returns 后再继续。

https://docs.python.org/3/library/subprocess.html#using-the-subprocess-module

如果您出于某种原因必须使用 Popen,您可以调用 Popen.wait,但我只会使用 run.

根据评论中的讨论添加此内容。

为了检测您的 exe 的状态 loading 您需要子进程向调用脚本发出该状态的信号,因为没有通用定义或检测方法该状态(例如通过退出代码等)。

有点粗糙但也是最简单的解决方案可能是让您的 exe 将定义的字符串打印到标准输出并让上面的子进程处理程序收听它。

当你让你的 exe 在达到你想要的状态(GUI 可见或其他)时在 stdout 上打印一个像 EXE Loaded. 这样的字符串, 然后你会轮询(或者更好地使用某种异步 io 的东西:))调用脚本的子进程输出,如下所示:

process = subprocess.Popen(['myFile.exe'], stdout=PIPE)

while True:
    output = process.stdout.readline()
    if process.poll() is not None and output == 'EXE Loaded.':
        break

这基本上会轮询启动的 exe 的标准输出并继续这样做,直到它收到 EXE Loaded. 作为字符串。 请注意,这只是解释其背后最基本的想法。 在真实示例中,您可能会使用某种更现代的异步等待工具。还要考虑使用其他答案中提到的 run 函数。建议不要直接使用POpen,除非你不能用subprocess.

的更高级别API来弥补