如何知道外部进程是否已在python中完成?

我在
Windows平台上工作.在我的python脚本中,我可以通过以下方式调用外部程序:

os.system("C:\mainfolder\menu.exe C:\others\file1.inp C:\others\file2.inp")

os.popen("C:\mainfolder\menu.exe C:\others\file1.inp C:\others\file2.inp")

subprocess.call(["C:\mainfolder\menu.exe","C:\others\file1.inp" "C:\others\file2.inp"])

哪里:

menu.exe:是我的外部程序.

file1和file2:是我外部程序的输入文件.

以上所有工作都很好.现在我的外部程序已成功完成,我需要完全关闭它以及由它打开的所有窗口.我已经阅读了很多其他帖子,python文档等,并找到了命令,例如:

os.system("taskkill /im C:\mainfolder\menu.exe")

os.kill(proc.pid,9)

child.kill() 

但他们没有工作.我花了很多时间试图找到适合我的东西,直到我意识到无论我输入哪些命令,它们都不会被读取,因为计算机不知道我的外部程序已经完成.这就是为什么我可以随时通过输入taskkill / im menu.exe轻松地从命令行终止程序,而不是从python中.

有人知道如何解决这个问题吗?我打电话给外部程序时是否应该包含其他内容?

最佳答案 这是一些示例代码,如何检测程序是否打开一个窗口.您需要知道的是消息框的标题,menu.exe打开,完成时:

import subprocess
import win32gui
import time


def enumHandler(hwnd, lParam):
    if win32gui.IsWindowVisible(hwnd):
        if 'Menu.exe Finished' in win32gui.GetWindowText(hwnd):
            proc.kill()

proc = subprocess.Popen(["C:\mainfolder\menu.exe","C:\others\file1.inp" "C:\others\file2.inp"])
while proc.poll() is None:
    win32gui.EnumWindows(enumHandler, None)
    time.sleep(1)
点赞