按名称杀死进程?
我试图杀死一个进程(特别是iChat)。 在命令行上,我使用这些命令:
ps -A | grep iChat
然后:
kill -9 PID
但是,我不确定如何将这些命令转换为Python。
假设你在一个类似Unix的平台上(这样ps -A
存在),
>>> import subprocess, signal >>> p = subprocess.Popen(['ps', '-A'], stdout=subprocess.PIPE) >>> out, err = p.communicate()
给你ps -A
的输出variables(一个string)。 你可以把它分解成几行并在它们上面循环…:
>>> 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
,但我不是特别喜欢这种风格,所以我宁愿使用这种命名常量)。
当然,你可以在这些线上做更复杂的处理,但是这样做模仿你正在做的事情。
如果你想避免ps
,那么跨越不同类Unix系统是很难做到的(从某种意义上说, ps
是获取进程列表的常用API)。 但是如果你有一个特定的类Unix系统,只需要(不需要任何跨平台的可移植性),这可能是可能的; 特别是在Linux上, /proc
伪文件系统是非常有用的。 但是我们需要澄清一下你的具体要求,然后才能在后面提供帮助。
psutil可以按名称find进程并杀死它:
import psutil PROCNAME = "python.exe" for proc in psutil.process_iter(): # check whether the process name matches if proc.name() == PROCNAME: proc.kill()
如果您必须考虑Windows案例才能跨平台,请尝试以下操作:
os.system('taskkill /f /im exampleProcess.exe')
如果你有killall:
os.system("killall -9 iChat");
要么:
os.system("ps -C iChat -o pid=|xargs kill -9")
这在Windows 7中为我工作
import subprocess subprocess.call("taskkill /IM geckodriver.exe")
下面的代码将杀死所有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)
您可以在unix系统中使用pkill <process_name>
来按名称杀死进程。
那么Python代码将是:
>>> import os >>> process_name=iChat >>> os.system('pkill '+process_name)
对我来说唯一有效的是:
例如
import subprocess proc = subprocess.Popen(["pkill", "-f", "scriptName.py"], stdout=subprocess.PIPE) proc.wait()
如果你想杀死进程(ES)或cmd.exe携带一个特定的标题(S)。
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 )
希望它有帮助。 他们可能是许多更好的解决scheme。
您可以使用WMI模块在Windows上执行此操作,虽然它比您习惯的UNIX操作系统笨拙得多; import WMI
需要很长时间,并且在这个过程中存在中等的痛苦。
9代表SIGKILL信号。 所以你可以用KILL
代替9
os.system("kill -s KILL 1234")
0R
os.sytem("kill -KILL 1234")
你可以从Python这些确切的命令是这样的
import os print os.system('kill -9 ' + pid)
但是你得到pid的命令需要一些工作,但是(不能仅仅假设它有iChat,它实际上是iChat),你应该使用killall来代替Matthew Flaschen
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()