我正在从一个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:是input文件到我的外部程序。
以上所有的工作正常。 现在我的外部程序已经成功完成了,我需要把它全部closures,以及所有打开的窗口。 我已经经历了很多其他职位,python文档等,并find命令,例如:
os.system("taskkill /im C:\mainfolder\menu.exe") os.kill(proc.pid,9) child.kill()
但他们没有工作。 我花了很多时间试图find一些对我有用的东西,直到我意识到无论我input哪些命令,它们都不会被读取,因为计算机不知道我的外部程序已经完成。 这就是为什么我可以随时从命令行轻松终止程序,只需键入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)
如果你想立即终止一个进程,即等待它结束,这是一个阻塞调用, os.system()
通常会等待,在这里讨论以及使用子os.system()
.communicate[0]
。
如果你想在你的程序的后面结束一个进程,一个异步的,非阻塞的进程,可能会得到它的PID,并且取决于shell=True
还是不是产生的shell或子进程的PID。
该pid可以用来立即通过使用psutil或os来结束它,或者等到它结束时使用很少的cpu时间,尽管其他任务可以在等待时完成,或者可以使用线程。
如果我在几个月前提出这个问题的时候,把这个问题发表到这个问题可能有点晚了,但是对其他读者来说也许还是有帮助的。
在回答我的问题的人的帮助下,特别是丹尼尔的回答,我找到了解决问题的办法。 不知道这是否是最好的,但我得到了我所需要的。
基本上,我没有在弹出窗口中查找单词“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')