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

时间:2014-11-08 17:35:58

标签: python windows terminate external-process

我在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中。

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

3 个答案:

答案 0 :(得分:2)

这是一些示例代码,如何检测程序是否打开窗口。所有你需要知道的是消息框的标题,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)

答案 1 :(得分:0)

如果您希望立即结束流程,即等待它结束,这是一次阻止通话,os.system()通常会等待,here以及.communicate[0]使用子流程there

如果你想在程序的后期结束一个进程,一个异步的,非阻塞的进程,可能得到它的pid,并且取决于shell=True是否是{{1}}的pid。 spawned shell或子进程。

pid可以用来通过使用psutil或os来结束它immediately,或者使用很少的cpu时间来结束wait until it ends,尽管其他任务可以在等待时完成,或者可以使用线程。

答案 2 :(得分:0)

将我的发现发布到这个问题可能有点晚了,因为我几个月前就问过它,但它可能对其他读者有帮助。

在尝试回答我的问题的人的帮助下,特别是丹尼尔的回答,我找到了解决问题的方法。不确定它是否是最好的,但我得到了我需要的东西。

基本上不是寻找单词"已完成"在我的弹出窗口中,我查找了外部程序生成的结果。如果已生成这些结果,则表示程序已完成,因此我终止了该过程:

 proc=subprocess.Popen(["C:\mainfolder\menu.exe","C:\others\file1.inp" "C:\others\file2.inp"])
 while proc.poll() is None:
     if os.path.exists("D:\\Results_folder\\Solution.txt"):
           time.sleep(10)
           os.system('taskkill /im menu.exe')