Risposte:
Supponendo che tu sia su una piattaforma simile a Unix (quindi ps -A
esiste),
>>> import subprocess, signal
>>> import os
>>> p = subprocess.Popen(['ps', '-A'], stdout=subprocess.PIPE)
>>> out, err = p.communicate()
ti dà ps -A
l'output nella out
variabile (una stringa). Puoi suddividerlo in linee e loop su di loro ...:
>>> for line in out.splitlines():
... if 'iChat' in line:
... pid = int(line.split(None, 1)[0])
... os.kill(pid, signal.SIGKILL)
...
(potresti evitare di importare signal
e usare al 9
posto di signal.SIGKILL
, ma non mi piace particolarmente quello stile, quindi preferirei usare la costante denominata in questo modo).
Ovviamente potresti eseguire elaborazioni molto più sofisticate su queste linee, ma questo imita ciò che stai facendo in shell.
Se quello che stai cercando è evitare ps
, è difficile da fare su diversi sistemi Unix-like ( ps
è la loro API comune per ottenere un elenco di processi, in un certo senso). Ma se hai in mente uno specifico sistema simile a Unix, solo (che non richiede alcuna portabilità multipiattaforma), potrebbe essere possibile; in particolare, su Linux, lo /proc
pseudo-filesystem è molto utile. Ma dovrai chiarire i tuoi requisiti esatti prima che possiamo aiutarti in quest'ultima parte.
psutil può trovare il processo per nome e ucciderlo:
import psutil
PROCNAME = "python.exe"
for proc in psutil.process_iter():
# check whether the process name matches
if proc.name() == PROCNAME:
proc.kill()
psutil
pacchetto, che potrebbe non essere presente sulla macchina di destinazione.
Se devi considerare il caso Windows per essere multipiattaforma, prova quanto segue:
os.system('taskkill /f /im exampleProcess.exe')
Se hai killall:
os.system("killall -9 iChat");
O:
os.system("ps -C iChat -o pid=|xargs kill -9")
pkill
, anche se penso di essere l'unica persona al mondo che lo usa al posto dikillall
killall java
?
pkill
perché l'unico di killall
cui ero a conoscenza era quello "uccidi tutto".
Puoi provare questo. ma prima è necessario installare psutil usandosudo pip install psutil
import psutil
for proc in psutil.process_iter(attrs=['pid', 'name']):
if 'ichat' in proc.info['name']:
proc.kill()
Puoi usarlo pkill <process_name>
in un sistema Unix per uccidere il processo per nome.
Quindi il codice Python sarà:
>>> import os
>>> process_name=iChat
>>> os.system('pkill '+process_name)
Se vuoi terminare il processo (i) o cmd.exe che trasporta un titolo particolare.
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 )
Spero che sia d'aiuto. Le loro potrebbero essere numerose soluzioni migliori per il mio.
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 risposta di Alex Martelli non funzionerà in Python 3 perché out
sarà un oggetto byte e quindi risulterà in un TypeError: a bytes-like object is required, not 'str'
test if 'iChat' in line:
.
Citando dalla documentazione del sottoprocesso :
communic () restituisce una tupla (stdout_data, stderr_data). I dati saranno stringhe se i flussi sono stati aperti in modalità testo; in caso contrario, byte.
Per Python 3, questo viene risolto aggiungendo text=True
(> = Python 3.7) o l' universal_newlines=True
argomento al Popen
costruttore. out
verrà quindi restituito come oggetto stringa.
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)
In alternativa, puoi creare una stringa utilizzando il metodo decode () dei byte.
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)