4

我正在编写一个 python 脚本来保持一个有缺陷的程序打开,我需要确定程序是否没有响应并在 Windows 上关闭它。我无法完全弄清楚如何做到这一点。

4

2 回答 2

4

在 Windows 上,您可以这样做:

import os
def isresponding(name):
    os.system('tasklist /FI "IMAGENAME eq %s" /FI "STATUS eq running" > tmp.txt' % name)
    tmp = open('tmp.txt', 'r')
    a = tmp.readlines()
    tmp.close()
    if a[-1].split()[0] == name:
        return True
    else:
        return False

但是,使用 PID 更为稳健:

def isrespondingPID(PID):
    os.system('tasklist /FI "PID eq %d" /FI "STATUS eq running" > tmp.txt' % PID)
    tmp = open('tmp.txt', 'r')
    a = tmp.readlines()
    tmp.close()
    if int(a[-1].split()[1]) == PID:
        return True
    else:
        return False

tasklist你那里可以获得更多的信息。要直接获取“NOT RESPONDING”流程,只需在给定函数中将“running”更改为“notresponsive”即可。在此处查看更多信息

于 2013-05-16T06:58:03.097 回答
0

从@Saullo GP Castro 获得了令人敬畏的答案,这是一个使用subprocess.Popen而不是os.system避免创建临时文件的版本。

import subprocess

def isresponding(name):
    """Check if a program (based on its name) is responding"""
    cmd = 'tasklist /FI "IMAGENAME eq %s" /FI "STATUS eq running"' % name
    status = subprocess.Popen(cmd, stdout=subprocess.PIPE).stdout.read()
    return name in str(status)

对应的PID版本为:

def isresponding_PID(pid):
    """Check if a program (based on its PID) is responding"""
    cmd = 'tasklist /FI "PID eq %d" /FI "STATUS eq running"' % pid
    status = subprocess.Popen(cmd, stdout=subprocess.PIPE).stdout.read()
    return str(pid) in str(status)

的使用timeit表明使用的subprocess.Popen速度是原来的两倍(主要是我们不需要遍历一个文件):

+-----------------------------+---------------------------+
|          Function           | Time in s (10 iterations) |
+-----------------------------+---------------------------+
|       isresponding_os       |           8.902           |
+-----------------------------+---------------------------+
|     isrespondingPID_os      |           8.318           |
+-----------------------------+---------------------------+
|   isresponding_subprocess   |           4.852           |
+-----------------------------+---------------------------+
| isresponding_PID_subprocess |           4.868           |
+-----------------------------+---------------------------+

令人惊讶的是,如果我们使用 PID,实现起来会慢一些,os.system但如果我们使用subprocess.Popen.

希望它可以提供帮助。

于 2019-02-02T10:28:50.890 回答