我在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中。
有人知道如何解决这个问题吗?我打电话给外部程序时是否应该包含其他内容?
答案 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')