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

2024-09-28 23:25:38 发布

您现在位置: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"])

其中:

在菜单.exe:是我的外部程序。在

file1和file2:是外部程序的输入文件。在

以上这些都很好。现在,我的外部程序已经成功完成,我需要完全关闭它以及它打开的所有窗口。我浏览了许多其他帖子、python文档等,发现了一些命令,例如:

^{pr2}$

但他们没有起作用。我花了很多时间试图找到对我有用的东西,直到我意识到无论我输入了什么命令,它们都不会被读取,因为计算机不知道我的外部程序已经完成。这就是为什么只要输入taskkill/im就可以随时从命令行终止程序菜单.exe但不是python的。在

有人知道怎么解决这个问题吗?,当我调用外部程序时,是否应该包含其他内容?在


Tags: 命令程序脚本oswindows方式菜单平台
3条回答

如果您想让一个进程立即结束,即等待它结束,这是一个阻塞调用,os.system()通常等待,讨论了here以及{}使用子进程there。在

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

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

下面是一些示例代码,如何检测程序是否打开了窗口。您只需知道消息框的标题,完成后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)

我几个月前问过这个问题,现在把我的发现发表在这个问题上可能有点晚了,但它可能对其他读者还是有帮助的。在

在那些试图回答我问题的人的帮助下,特别是丹尼尔的回答,我找到了解决问题的办法。不知道是不是最好的,但我得到了我需要的。在

基本上,我没有在弹出窗口中查找单词“finished”,而是查找外部程序生成的结果。如果生成了这些结果,则表示程序已完成,因此我将终止进程:

 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')

相关问题 更多 >