如何判断使用子进程打开的 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来弥补
我有一个使用子进程打开 .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
.