【发布时间】:2019-07-19 07:21:15
【问题描述】:
我一直在尝试确定一种使用 Python 优雅地关闭 Chrome(和其他进程)的方法。我已经尝试了几种方法,但所有方法都导致 Chrome 显示一条消息,指出“Chrome 没有正确关闭”。带有恢复按钮。当您从 Windows 中的任务管理器关闭程序时,不会发生这种情况。我编写了一个程序,利用 Falcon 提供 API 访问以关闭“托管”程序。代码不相关,但这是我尝试过的方法,它们可以很好地关闭 Chrome,但效果不佳。
def stop_app(app_exe):
for process in psutil.process_iter():
if process.name() == app_exe:
process.terminate()
替代:
for process in psutil.process_iter():
if process.name() == app_exe:
children = process.children(recursive=True)
children.append(process)
for p in children:
p.send_signal(signal.CTRL_BREAK_EVENT)
我也试过用 kill() 代替 terminate(),各种信号类型(Windows 真的只支持三种,CTRL_BREAK_EVENT、CNTL_C_EVENT、SIGTERM)。
我也尝试过使用 win32 库,但遇到了同样的问题。 Win32 也不是平台无关的,我发现 win32/wmi 库在查找正在运行的 Windows 进程时会使用大量系统资源。 psutil 库允许与平台无关,并且在遍历 Windows 进程时不会出现相同的性能问题。这是代码。
c = wmi.WMI()
for process in c.Win32_Process():
if process.Name == app_exe:
process.Terminate()
有人尝试过类似的方法并提出解决方案吗?
根据 CristiFati 建议的快速解决方案。
def enumWindowsProc(hwnd, lParam):
if (lParam is None) or ((lParam is not None) and
win32process.GetWindowThreadProcessId(hwnd)[1] == pid)):
text = win32gui.GetWindowText(hwnd)
if text:
wStyle = win32api.GetWindowLong(hwnd, win32con.GWL_STYLE)
if wStyle & win32con.WS_VISIBLE:
win32api.SendMessage(hwnd, win32con.WM_CLOSE)
def stop_app(app_exe):
for process in psutil.process_iter():
if process.name() == app_exe:
win32gui.EnumWindows(enumWindowsProc, process.pid)
【问题讨论】:
标签: python browser wmi pywin32 psutil