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.
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:
źródło
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:
źródło
Jeśli masz killall:
Lub:
źródło
pkill
, choć myślę, że jestem jedyną osobą na świecie, która go używa zamiastkillall
killall java
?pkill
ponieważ jedyne, okillall
czym wiedziałem, to „zabij wszystko”.to działało dla mnie w systemie Windows 7
źródło
Możesz tego spróbować. ale zanim będziesz musiał zainstalować psutil używając
sudo pip install psutil
źródło
Poniższy kod zabije wszystkie programy zorientowane na iChat:
źródło
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:
źródło
Jeśli chcesz zabić proces (y) lub cmd.exe niosący określone tytuły.
Mam nadzieję, że to pomoże. Mógłbym mieć wiele lepszych rozwiązań.
źródło
możesz użyć modułu WMI, aby to zrobić w systemie Windows, chociaż jest o wiele bardziej skomplikowany niż przyzwyczajeni do tego użytkownicy uniksowi;
import WMI
zajmuje dużo czasu, a proces ten wymaga pośredniego bólu.źródło
Dla mnie jedyne, co zadziałało, to:
Na przykład
źródło
9 oznacza sygnał SIGKILL. Możesz więc użyć
KILL
zamiast 90r
źródło
źródło
Odpowiedź Alex Martelli nie będzie działać w Pythonie 3, ponieważ
out
będzie obiektem bajtów, a zatemTypeError: a bytes-like object is required, not 'str'
podczas testowania spowodujeif 'iChat' in line:
.Cytowanie z dokumentacji podprocesu :
W przypadku Pythona 3 można to rozwiązać, dodając argument
text=True
(> = Python 3.7) lubuniversal_newlines=True
doPopen
konstruktora.out
zostanie zwrócona jako obiekt typu string.Alternatywnie możesz utworzyć ciąg przy użyciu metody decode () bajtów.
źródło
źródło