Answers:
假设您使用的是类似Unix的平台(因此ps -A
存在),
>>> import subprocess, signal
>>> import os
>>> 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
伪文件系统非常有用。但是在我们为后一部分提供帮助之前,您需要澄清您的确切要求。
psutil可以按名称查找进程并将其杀死:
import psutil
PROCNAME = "python.exe"
for proc in psutil.process_iter():
# check whether the process name matches
if proc.name() == PROCNAME:
proc.kill()
psutil
软件包,而该软件包可能在目标计算机上不存在。
如果必须考虑Windows情况才能跨平台,请尝试以下操作:
os.system('taskkill /f /im exampleProcess.exe')
如果您有killall:
os.system("killall -9 iChat");
要么:
os.system("ps -C iChat -o pid=|xargs kill -9")
pkill
,尽管我认为我是世界上唯一使用它而不是它的人killall
killall java
?
pkill
是因为我唯一killall
知道的就是“杀死一切”。
如果要杀死带有特定标题的进程或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 )
希望能帮助到你。他们可能是许多更好的解决方案。
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)
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
参数来解决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的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)