按名称杀死进程?

时间:2010-05-31 00:37:32

标签: python process kill

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

ps -A | grep iChat 

然后:

kill -9 PID

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

20 个答案:

答案 0 :(得分:169)

psutil可以按名称查找进程并将其删除:

import psutil

PROCNAME = "python.exe"

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

答案 1 :(得分:73)

假设您使用的是类Unix平台(以便ps -A存在),

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

ps -A变量(字符串)中为您提供out的输出。你可以将它分解成行并循环它们......:

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

答案 2 :(得分:32)

如果您必须考虑Windows案例才能跨平台,请尝试以下方法:

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

答案 3 :(得分:21)

如果你有killall:

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

或者:

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

答案 4 :(得分:5)

这在Windows 7中对我有用

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

答案 5 :(得分: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)

答案 6 :(得分:1)

您可以在unix系统中使用pkill <process_name>来按名称终止进程。

然后python代码将是:

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

答案 7 :(得分:1)

使用[ { "name" : "test", "gender" : "male", "attributes" : [ { "field_id" : "123", "field_value" : "['Public']" }, { "field_id" : "124", "field_value" : "true" }, { "field_id" : "125", "field_value" : "['Single']" }, ] }, { "name" : "test3", "gender" : "male", "attributes" : [ { "field_id" : "123", "field_value" : "['Public']" }, { "field_id" : "125", "field_value" : "['Married']" }, ] }, { "name" : "test2", "gender" : "male", "attributes" : [ { "field_id" : "125", "field_value" : "['Married']" }, ] }, { "name" : "test4", "gender" : "male", "attributes" : [ ] } ] 获取流程对象。

Process

答案 8 :(得分:1)

对我来说唯一有用的是:

例如

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

答案 9 :(得分: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 ) 

希望它有所帮助。他们可能是我的许多更好的解决方案。

答案 10 :(得分:1)

你可以尝试这个.. 在您必须使用#: .\models.py:29 msgid "car" msgstr "نوع خودرو"

安装psutil之前
sudo pip install psutil

答案 11 :(得分:0)

您可以使用 ... AS pmrr ... 模块来终止使用进程名称的进程。在大多数情况下,这应该是跨平台的。

psutil

我基本上扩展了@Giampaolo Rodolà 的answer

  • 添加异常处理
  • 添加了查看 cmdline 的检查

我也将此片段作为 gist 发布。

注意:一旦您对所期望的行为感到满意,您就可以删除打印语句。

答案 12 :(得分:0)

与 Giampaolo Rodolà 的回答风格相同,但作为一个衬垫,不区分大小写,无需匹配整个进程名称,在 Windows 中,您必须包含 .exe 后缀。

[x.kill() for x in psutil.process_iter() if 'ichat' in x.name().lower()]

答案 13 :(得分:0)

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

从子流程documentation报价:

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

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

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的decode()方法创建一个字符串。

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)

答案 14 :(得分:0)

import os, signal

def check_kill_process(pstring):
    for line in os.popen("ps ax | grep " + pstring + " | grep -v grep"):
        fields = line.split()
        pid = fields[0]
        os.kill(int(pid), signal.SIGKILL)

答案 15 :(得分:0)

import os
os.popen("kill -9 $(ps aux | grep  " + processname + " | awk '{print $2}')")

答案 16 :(得分:0)

9代表SIGKILL信号。因此,您可以使用KILL代替9

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

0R

os.sytem("kill -KILL 1234")

答案 17 :(得分:0)

你可以使用WMI模块在Windows上执行此操作,尽管它比unix人习惯了很多笨拙; import WMI需要很长时间才能完成这个过程。

答案 18 :(得分:-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()

答案 19 :(得分:-1)

你可以像python这样的那些确切的命令

import os 
print os.system('kill -9 ' + pid)

但是你获得pid的命令需要一些工作(不能只假设因为它有iChat它真的是iChat)你应该使用killall而不是Matthew Flaschen的建议