Antworten:
Angenommen, Sie befinden sich auf einer Unix-ähnlichen Plattform (so dass diese ps -A
existiert),
>>> import subprocess, signal
>>> import os
>>> p = subprocess.Popen(['ps', '-A'], stdout=subprocess.PIPE)
>>> out, err = p.communicate()
gibt Ihnen ps -A
die Ausgabe in der out
Variablen (eine Zeichenfolge). Sie können es in Zeilen zerlegen und auf ihnen schleifen ...:
>>> for line in out.splitlines():
... if 'iChat' in line:
... pid = int(line.split(None, 1)[0])
... os.kill(pid, signal.SIGKILL)
...
(Sie könnten das Importieren vermeiden signal
und 9
stattdessen verwenden signal.SIGKILL
, aber ich mag diesen Stil einfach nicht besonders, deshalb würde ich die benannte Konstante lieber auf diese Weise verwenden).
Natürlich könnten Sie diese Zeilen viel ausgefeilter verarbeiten, aber dies ahmt nach, was Sie in der Shell tun.
Wenn Sie vermeiden ps
möchten, ist dies auf verschiedenen Unix-ähnlichen Systemen schwierig ( ps
in gewissem Sinne die gemeinsame API zum Abrufen einer Prozessliste). Wenn Sie jedoch nur an ein bestimmtes Unix-ähnliches System denken (das keine plattformübergreifende Portabilität erfordert), ist dies möglicherweise möglich. Insbesondere unter Linux ist das /proc
Pseudo-Dateisystem sehr hilfreich. Sie müssen jedoch Ihre genauen Anforderungen klären, bevor wir in diesem letzten Teil helfen können.
psutil kann den Prozess anhand seines Namens finden und töten:
import psutil
PROCNAME = "python.exe"
for proc in psutil.process_iter():
# check whether the process name matches
if proc.name() == PROCNAME:
proc.kill()
psutil
Paket erforderlich ist , das möglicherweise nicht auf dem Zielcomputer vorhanden ist.
Wenn Sie den Windows-Fall berücksichtigen müssen, um plattformübergreifend zu sein, versuchen Sie Folgendes:
os.system('taskkill /f /im exampleProcess.exe')
Wenn Sie Killall haben:
os.system("killall -9 iChat");
Oder:
os.system("ps -C iChat -o pid=|xargs kill -9")
pkill
, obwohl ich denke, ich bin die einzige Person auf der Welt, die es anstelle vonkillall
killall java
?
pkill
weil das einzige, was killall
mir bewusst war, das "alles töten" war.
Sie können dies versuchen. aber bevor Sie psutil mit installieren müssensudo pip install psutil
import psutil
for proc in psutil.process_iter(attrs=['pid', 'name']):
if 'ichat' in proc.info['name']:
proc.kill()
Sie können pkill <process_name>
in einem Unix-System verwenden, um den Prozess nach Namen zu beenden.
Dann lautet der Python-Code:
>>> import os
>>> process_name=iChat
>>> os.system('pkill '+process_name)
Wenn Sie die Prozesse oder cmd.exe mit einem bestimmten Titel beenden möchten.
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 )
Ich hoffe es hilft. Es könnten zahlreiche bessere Lösungen für meine sein.
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)
Die Antwort von Alex Martelli funktioniert in Python 3 nicht, da out
sie ein Byte-Objekt ist und daher TypeError: a bytes-like object is required, not 'str'
beim Testen zu einem führt if 'iChat' in line:
.
Zitieren aus Teilprozess Dokumentation :
communic () gibt ein Tupel zurück (stdout_data, stderr_data). Die Daten sind Zeichenfolgen, wenn Streams im Textmodus geöffnet wurden. ansonsten Bytes.
Für Python 3 wird dies gelöst, indem dem Konstruktor das Argument text=True
(> = Python 3.7) oder hinzugefügt wird . wird dann als String-Objekt zurückgegeben.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)
Alternativ können Sie eine Zeichenfolge mit der Methode decode () von Bytes erstellen.
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)