113

我正在尝试终止一个进程(特别是 iChat)。在命令行上,我使用以下命令:

ps -A | grep iChat 

然后:

kill -9 PID

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

4

17 回答 17

237

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

import psutil

PROCNAME = "python.exe"

for proc in psutil.process_iter():
    # check whether the process name matches
    if proc.name() == PROCNAME:
        proc.kill()
于 2010-11-19T23:11:16.970 回答
88

假设你在一个类 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伪文件系统非常有用。但是,您需要先明确您的确切要求,然后我们才能在后面的部分提供帮助。

于 2010-05-31T00:50:04.243 回答
37

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

os.system('taskkill /f /im exampleProcess.exe')
于 2012-07-26T00:54:18.237 回答
24

如果你有killall:

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

或者:

os.system("ps -C iChat -o pid=|xargs kill -9")
于 2010-05-31T00:41:21.480 回答
7

这在 Windows 7 中对我有用

import subprocess
subprocess.call("taskkill /IM geckodriver.exe")
于 2016-12-12T16:35:22.827 回答
6

你可以试试这个。但在您需要使用安装psutil之前sudo pip install psutil

import psutil
for proc in psutil.process_iter(attrs=['pid', 'name']):
    if 'ichat' in proc.info['name']:
        proc.kill()
于 2018-03-12T06:53:06.930 回答
1

下面的代码将杀死所有面向 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)
于 2011-09-21T09:01:29.607 回答
1

使用Process.

>>> import psutil
>>> p = psutil.Process(23442)
>>> p
psutil.Process(pid=23442, name='python3.6', started='09:24:16')
>>> p.kill()
>>> 
于 2020-10-08T09:27:37.393 回答
1

您可以使用该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

我还发布了这个片段作为要点

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

于 2021-05-12T18:51:01.813 回答
0

您可以在 Windows 上使用 WMI 模块来执行此操作,尽管它比 unix 人习惯的要笨重得多;import WMI需要很长时间,并且在这个过程中会有中间的痛苦。

于 2010-05-31T02:48:53.793 回答
0

如果您想杀死带有特定标题的进程或 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 ) 

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

于 2016-08-26T07:01:21.700 回答
0

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

引用子流程文档

通信()返回一个元组(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)

或者,您可以使用字节的 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)
于 2020-05-25T21:09:44.190 回答
0

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

[x.kill() for x in psutil.process_iter() if 'ichat' in x.name().lower()]
于 2021-01-18T05:20:06.083 回答
-1

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

那么python代码将是:

>>> import os
>>> process_name=iChat
>>> os.system('pkill '+process_name)
于 2010-05-31T01:28:34.273 回答
-1

对我来说,唯一有效的是:

例如

import subprocess
proc = subprocess.Popen(["pkill", "-f", "scriptName.py"], stdout=subprocess.PIPE)
proc.wait()
于 2014-09-22T13:19:41.477 回答
-1
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)
于 2019-11-29T06:12:37.417 回答
-2
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()
于 2013-01-11T10:28:50.897 回答