J'essaye 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.
Réponses:
En supposant que vous êtes sur une plate-forme de type Unix (donc qui ps -A
existe),
>>> import subprocess, signal
>>> import os
>>> p = subprocess.Popen(['ps', '-A'], stdout=subprocess.PIPE)
>>> out, err = p.communicate()
vous donne ps -A
la sortie de la out
variable (une chaîne). Vous pouvez le décomposer en lignes et faire une boucle dessus ...:
>>> for line in out.splitlines():
... if 'iChat' in line:
... pid = int(line.split(None, 1)[0])
... os.kill(pid, signal.SIGKILL)
...
(vous pouvez éviter d'importer signal
et utiliser à la 9
place de signal.SIGKILL
, mais je n'aime pas particulièrement ce style, donc je préfère utiliser la constante nommée de cette façon).
Bien sûr, vous pourriez faire un traitement beaucoup plus sophistiqué sur ces lignes, mais cela imite ce que vous faites en shell.
Si ce que vous recherchez est d'éviter ps
, c'est difficile à faire sur différents systèmes de type Unix ( ps
est leur API commune pour obtenir une liste de processus, dans un sens). Mais si vous avez en tête un système spécifique de type Unix uniquement (ne nécessitant aucune portabilité multiplateforme), cela peut être possible; en particulier, sous Linux, le /proc
pseudo-système de fichiers est très utile. Mais vous devrez clarifier vos exigences exactes avant que nous puissions vous aider sur cette dernière partie.
psutil peut trouver le processus par son nom et le tuer:
import psutil
PROCNAME = "python.exe"
for proc in psutil.process_iter():
# check whether the process name matches
if proc.name() == PROCNAME:
proc.kill()
psutil
package, qui peut ne pas être présent sur la machine cible.
Si vous devez considérer le cas Windows pour être multiplateforme, essayez ce qui suit:
os.system('taskkill /f /im exampleProcess.exe')
Si vous avez killall:
os.system("killall -9 iChat");
Ou:
os.system("ps -C iChat -o pid=|xargs kill -9")
pkill
, même si je pense que je suis la seule personne au monde à l'utiliser à la place dekillall
killall java
?
pkill
parce que le seul dont killall
j'étais au courant était celui "tuer tout".
Vous pouvez essayer ceci. mais avant de devoir installer psutil en utilisantsudo pip install psutil
import psutil
for proc in psutil.process_iter(attrs=['pid', 'name']):
if 'ichat' in proc.info['name']:
proc.kill()
Le code ci-dessous supprimera 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)
Vous pouvez utiliser pkill <process_name>
dans un système unix pour tuer le processus par son nom.
Ensuite, le code python sera:
>>> import os
>>> process_name=iChat
>>> os.system('pkill '+process_name)
Si vous voulez tuer le (s) processus (s) ou cmd.exe portant un (des) titre (s) particulier (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 )
J'espère que ça aide. Leur pourrait être de nombreuses meilleures solutions à la mienne.
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)
La réponse Alex Martelli ne fonctionnera pas dans Python 3 car out
sera un objet octets et entraînera donc un TypeError: a bytes-like object is required, not 'str'
lors du testif 'iChat' in line:
.
Citations de la documentation des sous-processus :
communique () renvoie un tuple (stdout_data, stderr_data). Les données seront des chaînes si les flux ont été ouverts en mode texte; sinon, octets.
Pour Python 3, ceci est résolu en ajoutant le text=True
(> = Python 3.7) ou l' universal_newlines=True
argument au Popen
constructeur. out
sera alors renvoyé sous forme d'objet chaîne.
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)
Vous pouvez également créer une chaîne en utilisant la méthode decode () d'octets.
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)