我有一个使用子进程打开.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
。