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



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

我在找这样的东西:

import subprocess
subprocess.Popen(['myFile.exe'])
While myFile.exe is still opening:
# still loading, do nothing
print("exe finished opening")

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

谢谢!

将此作为讨论的结果添加到注释中。

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

有点粗糙,但最简单的解决方案可能是让exe将定义的字符串打印到stdout,并让上面的子流程处理程序侦听它

当你让你的exe在stdout上打印一个类似EXE Loaded.的字符串,一旦它达到你想要的状态(GUI可见或其他什么(,然后,您将轮询(或者更好地使用某种异步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的stdout,并继续这样做,直到它接收到作为字符串的EXE Loaded.。请注意,这将只是解释其背后最基本的想法。在一个真实的例子中,您可能会使用某种更现代的异步等待。还可以考虑使用run函数,如另一个答案中所述。建议不要直接使用POpen,除非您无法使用subprocess的更高级别API。

如果不必使用subprocess.Popen,建议使用subprocess.run。如果使用run,python脚本将等待run返回后再继续。

https://docs.python.org/3/library/subprocess.html#using-子流程模块

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

最新更新