127 votes

Tuer le processus par son nom en Python

J'essaie de tuer un processus (en particulier iChat). Sur la ligne de commande, j'utilise ces commandes:

 ps -A | grep iChat 
 

Ensuite:

 kill -9 PID
 

Cependant, je ne sais pas exactement comment traduire ces commandes en Python.

259voto

Giampaolo Rodolà Points 2965

psutil peut trouver un processus par son nom et le tuer:

 import psutil

PROCNAME = "python.exe"

for proc in psutil.process_iter():
    if proc.name() == PROCNAME:
        proc.kill()
 

93voto

Alex Martelli Points 330805

En supposant que vous êtes sur un Unix-like plate-forme (de sorte que l' ps -A existe),

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

vous donne ps -As'sortie en out variable (une chaîne). Vous pouvez le décomposer en lignes et en boucle sur eux...:

>>> for line in out.splitlines():
...   if 'iChat' in line:
...     pid = int(line.split(None, 1)[0])
...     os.kill(pid, signal.SIGKILL)
... 

(vous pourriez éviter d'importer signal, et l'utilisation 9 au lieu de signal.SIGKILL, mais je n'aime pas particulièrement ce style, donc j'aurais plutôt utilisé la constante nommée de cette façon).

Bien sûr, vous pourriez faire beaucoup plus sophistiqués de traitement sur ces lignes, mais ce n'imite ce que vous faites dans le shell.

Si ce que vous êtes après, c'est éviter d' ps, c'est difficile à faire à travers les différents systèmes de type Unix (ps est leur API commune pour obtenir une liste des processus, en un sens). Mais si vous avez un spécifique de système de type Unix à l'esprit, seulement (ne nécessitant pas une croix-plate-forme de portabilité), il peut être possible; en particulier, sur Linux, l' /proc pseudo-système de fichiers est très utile. Mais vous aurez besoin de clarifier exactement à vos exigences avant de pouvoir nous aider sur cette dernière partie.

43voto

limitCracker Points 377

Si vous devez considérer le cas Windows pour être multi-plateforme, essayez ce qui suit:

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

24voto

Matthew Flaschen Points 131723

Si vous avez killall:

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

Ou:

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

1voto

Poobalan Points 46

Le code ci-dessous va tuer tous les programmes orientés 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)
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X