按名称杀死进程?


问题内容

我正在尝试终止一个进程(特别是iChat)。在命令行上,我使用以下命令:

ps -A | grep iChat

然后:

kill -9 PID

但是,我不确定如何将这些命令转换为Python。


问题答案:

假设您使用的是类似Unix的平台(因此ps -A存在),

>>> import subprocess, signal
>>> import os
>>> p = subprocess.Popen(['ps', '-A'], stdout=subprocess.PIPE)
>>> out, err = p.communicate()

ps -Aout变量(字符串)中为您提供输出。您可以将其分解为几行然后循环播放……:

>>> for line in out.splitlines():
...   if 'iChat' in line:
...     pid = int(line.split(None, 1)[0])
...     os.kill(pid, signal.SIGKILL)
...

(您可以避免导入signal,而9不要使用signal.SIGKILL,但是我并不特别喜欢这种样式,所以我宁愿以这种方式使用命名常量)。

当然,您可以在这些行上执行更复杂的处理,但这模仿了您在Shell中所做的事情。

如果您想要避免ps的事情,那么在不同的类似Unix的系统上就很难做到(ps从某种意义上说,这是它们的通用API来获取进程列表)。但是,如果只考虑特定的类Unix系统(不需要任何跨平台可移植性),则可能是可行的。特别是在Linux上,/proc伪文件系统非常有用。但是,在我们为后一部分提供帮助之前,您需要澄清您的确切要求。