Próbuję zabić proces (szczególnie iChat). W wierszu poleceń używam tych poleceń:
ps -A | grep iChat
Następnie:
kill -9 PID
Jednak nie jestem do końca pewien, jak przetłumaczyć te polecenia na Python.
Odpowiedzi:
Zakładając, że jesteś na platformie podobnej do Uniksa (więc taka ps -A
istnieje),
>>> import subprocess, signal
>>> import os
>>> p = subprocess.Popen(['ps', '-A'], stdout=subprocess.PIPE)
>>> out, err = p.communicate()
daje ps -A
wynik w out
zmiennej (łańcuch). Możesz podzielić to na linie i zapętlić na nich ...:
>>> for line in out.splitlines():
... if 'iChat' in line:
... pid = int(line.split(None, 1)[0])
... os.kill(pid, signal.SIGKILL)
...
(możesz uniknąć importowania signal
i używać 9
zamiast niego signal.SIGKILL
, ale po prostu nie lubię tego stylu, więc wolałbym użyć nazwanej stałej w ten sposób).
Oczywiście na tych liniach można by wykonać znacznie bardziej wyrafinowane przetwarzanie, ale to naśladuje to, co robisz w powłoce.
Jeśli tym, czego szukasz, jest unikanie ps
, trudno to zrobić w różnych systemach uniksopodobnych ( ps
w pewnym sensie jest to ich wspólny interfejs API do uzyskania listy procesów). Ale jeśli masz na myśli tylko konkretny system podobny do Uniksa (nie wymagającego przenoszenia między platformami), może to być możliwe; w szczególności w systemie Linux/proc
pseudosystem plików jest bardzo pomocny. Ale zanim będziemy mogli pomóc w tej drugiej części, musisz wyjaśnić swoje dokładne wymagania.
psutil może znaleźć proces według nazwy i zabić go:
import psutil
PROCNAME = "python.exe"
for proc in psutil.process_iter():
# check whether the process name matches
if proc.name() == PROCNAME:
proc.kill()
psutil
pakietu, którego może nie być na maszynie docelowej.
Jeśli musisz wziąć pod uwagę przypadek systemu Windows, aby działać na wielu platformach, wypróbuj następujące rozwiązania:
os.system('taskkill /f /im exampleProcess.exe')
Jeśli masz killall:
os.system("killall -9 iChat");
Lub:
os.system("ps -C iChat -o pid=|xargs kill -9")
pkill
, choć myślę, że jestem jedyną osobą na świecie, która go używa zamiastkillall
killall java
?
pkill
ponieważ jedyne, o killall
czym wiedziałem, to „zabij wszystko”.
Możesz tego spróbować. ale zanim będziesz musiał zainstalować psutil używającsudo pip install psutil
import psutil
for proc in psutil.process_iter(attrs=['pid', 'name']):
if 'ichat' in proc.info['name']:
proc.kill()
Możesz użyć pkill <process_name>
w systemie uniksowym do zabicia procesu według nazwy.
Wtedy kod Pythona będzie wyglądał następująco:
>>> import os
>>> process_name=iChat
>>> os.system('pkill '+process_name)
Jeśli chcesz zabić proces (y) lub cmd.exe niosący określone tytuły.
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 )
Mam nadzieję, że to pomoże. Mógłbym mieć wiele lepszych rozwiązań.
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)
Odpowiedź Alex Martelli nie będzie działać w Pythonie 3, ponieważ out
będzie obiektem bajtów, a zatem TypeError: a bytes-like object is required, not 'str'
podczas testowania spowodujeif 'iChat' in line:
.
Cytowanie z dokumentacji podprocesu :
komunikacja () zwraca krotkę (stdout_data, stderr_data). Dane będą ciągami, jeśli strumienie zostały otwarte w trybie tekstowym; w przeciwnym razie bajty.
W przypadku Pythona 3 można to rozwiązać, dodając argument text=True
(> = Python 3.7) lub universal_newlines=True
do Popen
konstruktora. out
zostanie zwrócona jako obiekt typu string.
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)
Alternatywnie możesz utworzyć ciąg przy użyciu metody decode () bajtów.
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)