按名称杀死进程?


99

我试图杀死一个进程(特别是iChat)。在命令行上,我使用以下命令:

ps -A | grep iChat 

然后:

kill -9 PID

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

Answers:


86

假设您使用的是类似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伪文件系统非常有用。但是在我们为后一部分提供帮助之前,您需要澄清您的确切要求。


1
效果很好!我正在运行Mac环境,因此我认为这将是完美的。谢谢你的帮助。
亚伦

以上适用于.nix,但不是pythonic。如下所述,适当的方法是使用os.system('taskkill / f / im exampleProcess.exe')方法,它是核心python的一部分。
琼斯恢复莫妮卡的照片

@Jonesome:您的答案似乎是针对Windows的(由于命令语法和.exe文件名),但问题似乎是针对Mac OS的。
Vasudev Ram 2016年

我更喜欢GiampaoloRodolà的答案,因为即使它不是Python语言,也可以在Windows上运行,前提是您安装了Cygwin或Msys。psutil在Windows的Python 2.7.10中不存在。尝试在计算机上尝试“ pip install psutil”失败,原因是我需要安装Visual C ++ 9.0。拧!我宁愿安装Cygwin或Msys。
Andrew Bainbridge

从Python 3.2开始在Windows中运行,但是通常signal将是被终止进程的退出代码。
Cees Timmerman

201

psutil可以按名称查找进程并将其杀死:

import psutil

PROCNAME = "python.exe"

for proc in psutil.process_iter():
    # check whether the process name matches
    if proc.name() == PROCNAME:
        proc.kill()

51
这个。因为是跨平台的
Bengt

2
或者,如果您想通过命令行输入以下内容:如果proc.cmdline中的“ your_python_script.py”:..kill
OWADVL 2013年

11
这样做的缺点是需要psutil软件包,而该软件包可能在目标计算机上不存在。
CadentOrange 2014年

1
@Bengt。如果您包括Windows,这不是跨平台的!psutil不是Python 2.7.10的一部分。除非您安装Visual C ++ 9.0,否则“ pip install psutil”将失败,这在许多情况下是不切实际的。不过,恭喜您17次投票:-)
Andrew Bainbridge

5
“ pip install psutil”可以正常工作,因为它将在pypi上检索wheel版本。不,您不需要编译器。
GiampaoloRodolà16年

36

如果必须考虑Windows情况才能跨平台,请尝试以下操作:

os.system('taskkill /f /im exampleProcess.exe')

@ alansiqueira27不幸的是,这只是Windows cmd的情况。您必须查看以上答案才能获得跨平台解决方案。
limitcracker

这适用于我的用例。谢谢!请注意,这很干净,它会用该名称杀死所有进程,因此,如果您有多个不终止的Y.exe,则该进程的所有进程ID都将被终止。
AlgebraicGeometryStudent

23

如果您有killall:

os.system("killall -9 iChat");

要么:

os.system("ps -C iChat -o pid=|xargs kill -9")

9
还有pkill,尽管我认为我是世界上唯一使用它而不是它的人killall
Michael Mrozek 2010年

1
好的,很酷,第一个命令看起来很完美。谢谢您的帮助。
亚伦

1
@MichaelMrozek您怎么能忍受打字之类的甜蜜感觉killall java
2013年

我使用@Michael pkill是因为我唯一killall知道的就是“杀死一切”。
凯尔·斯特兰德

7

这在Windows 7中对我有用

import subprocess
subprocess.call("taskkill /IM geckodriver.exe")


2

以下代码将杀死所有面向iChat的程序:

p = subprocess.Popen(['pgrep', '-l' , 'iChat'], stdout=subprocess.PIPE)
out, err = p.communicate()

for line in out.splitlines():        
    line = bytes.decode(line)
    pid = int(line.split(None, 1)[0])
    os.kill(pid, signal.SIGKILL)

1

您可以pkill <process_name>在Unix系统中使用按名称杀死进程。

那么python代码将是:

>>> import os
>>> process_name=iChat
>>> os.system('pkill '+process_name)

我使用的所有系统都是Mac,当我尝试运行pkill时,只是在告诉我找不到该命令。
亚伦

1

如果要杀死带有特定标题的进程或cmd.exe。

import csv, os
import subprocess
# ## Find the command prompt windows.
# ## Collect the details of the command prompt windows and assign them.
tasks = csv.DictReader(subprocess.check_output('tasklist /fi "imagename eq cmd.exe" /v /fo csv').splitlines(), delimiter=',', quotechar='"')
# ## The cmds with titles to be closed.
titles= ["Ploter", "scanFolder"]

# ## Find the PIDs of the cmds with the above titles.
PIDList = []
for line in tasks:
    for title in titles:
        if  title in line['Window Title']:
           print line['Window Title']       
           PIDList.append(line['PID'])

# ## Kill the CMDs carrying the PIDs in PIDList
for id in PIDList:
    os.system('taskkill /pid ' + id ) 

希望能帮助到你。他们可能是许多更好的解决方案。


0

您可以在Windows上使用WMI模块来执行此操作,尽管它比您使用Unix的人要笨拙得多;import WMI需要很长时间,并且在此过程中会遇到中等痛苦。


0

对我而言,唯一起作用的是:

例如

import subprocess
proc = subprocess.Popen(["pkill", "-f", "scriptName.py"], stdout=subprocess.PIPE)
proc.wait()

0

9代表SIGKILL信号。所以你可以KILL代替9

os.system("kill -s KILL 1234")

0r

os.sytem("kill -KILL 1234")


0

Alex Martelli的答案在Python 3中不起作用,因为它out是一个字节对象,因此在TypeError: a bytes-like object is required, not 'str'测试时导致了错误if 'iChat' in line:

引用子流程文档

communication()返回一个元组(stdout_data,stderr_data)。如果以文本模式打开流,则数据将为字符串;否则,数据将为字符串。否则为字节。

对于Python 3,这可以通过在构造函数中添加text=True(> = Python 3.7)或universal_newlines=True参数来解决Popenout然后将作为字符串对象返回。

import subprocess, signal
import os

p = subprocess.Popen(['ps', '-A'], stdout=subprocess.PIPE, text=True)
out, err = p.communicate()

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

另外,您可以使用bytes的encode()方法创建一个字符串。

import subprocess, signal
import os

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

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

-1
import psutil
pid_list=psutil.get_pid_list()
print pid_list
p = psutil.Process(1052)
print p.name
for i in pid_list:
    p = psutil.Process(i)
    p_name=p.name
    print str(i)+" "+str(p.name)
    if p_name=="PerfExp.exe":
        print "*"*20+" mam ho "+"*"*20
        p.kill()
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.