杀人过程的名字?

我正在尝试终止一个进程(特别是 iChat):

ps -A | grep iChat

然后:

kill -9 PID

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

262019 次浏览

如果你杀了所有人:

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

或者:

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

假设您是在一个类 Unix 平台上(这样就存在 ps -A) ,

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

out变量(字符串)中给出 ps -A的输出。你可以把它分成几行,然后在上面循环... ... :

>>> 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伪文件系统非常有帮助。但是你需要澄清你的具体要求,然后我们才能帮助这后一部分。

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

然后,python 代码将是:

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

you can use WMI module to do this on windows, though it's a lot clunkier than you unix folks are used to; import WMI takes a long time and there's intermediate pain to get at the process.

Psutil 可以通过名称查找 process 并终止它:

import psutil


PROCNAME = "python.exe"


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

下面的代码会杀死所有面向 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)

如果你必须考虑 Windows 的情况,以便跨平台,那么尝试以下方法:

os.system('taskkill /f /im exampleProcess.exe')
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()

对我来说,唯一奏效的就是:

比如说

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

如果您希望终止带有特定标题的进程或 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 )

希望能有所帮助,他们的方法可能比我的更好。

这在 Windows 7中对我很管用

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

You can try this. 但是在你需要使用 sudo pip install psutil安装 Psutil之前

import psutil
for proc in psutil.process_iter(attrs=['pid', 'name']):
if 'ichat' in proc.info['name']:
proc.kill()
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 的答案在 Python3中不起作用,因为 out将是一个字节对象,因此在测试 if 'iChat' in line:时会产生一个 TypeError: a bytes-like object is required, not 'str'

Quoting from subprocess 文件:

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)

或者,可以使用字节的 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)

使用 Process获取进程对象。

>>> import psutil
>>> p = psutil.Process(23442)
>>> p
psutil.Process(pid=23442, name='python3.6', started='09:24:16')
>>> p.kill()
>>>

与 Giampaolo Rodolà 的回答风格相同,但是作为一个行,不区分大小写,而且不需要匹配整个进程名,在窗口中你必须包含 .exe后缀。

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

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

import traceback


import psutil




def kill(process_name):
"""Kill Running Process by using it's name
- Generate list of processes currently running
- Iterate through each process
- Check if process name or cmdline matches the input process_name
- Kill if match is found
Parameters
----------
process_name: str
Name of the process to kill (ex: HD-Player.exe)
Returns
-------
None
"""
try:
print(f'Killing processes {process_name}')
processes = psutil.process_iter()
for process in processes:
try:
print(f'Process: {process}')
print(f'id: {process.pid}')
print(f'name: {process.name()}')
print(f'cmdline: {process.cmdline()}')
if process_name == process.name() or process_name in process.cmdline():
print(f'found {process.name()} | {process.cmdline()}')
process.terminate()
except Exception:
print(f"{traceback.format_exc()}")


except Exception:
print(f"{traceback.format_exc()}")

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

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

我还将这个片段作为 大意发布。

注意: 一旦您满意观察到所需的行为,就可以删除 print 语句。