Jawaban:
Dengan asumsi Anda menggunakan platform mirip Unix (jadi itu ps -A
ada),
>>> import subprocess, signal
>>> import os
>>> p = subprocess.Popen(['ps', '-A'], stdout=subprocess.PIPE)
>>> out, err = p.communicate()
memberi Anda ps -A
output dalam out
variabel (string). Anda dapat memecahnya menjadi beberapa baris dan mengulanginya ...:
>>> for line in out.splitlines():
... if 'iChat' in line:
... pid = int(line.split(None, 1)[0])
... os.kill(pid, signal.SIGKILL)
...
(Anda dapat menghindari mengimpor signal
, dan menggunakan 9
alih-alih signal.SIGKILL
, tetapi saya hanya tidak terlalu menyukai gaya itu, jadi saya lebih suka menggunakan konstanta bernama dengan cara ini).
Tentu saja Anda dapat melakukan pemrosesan yang jauh lebih canggih pada jalur ini, tetapi ini meniru apa yang Anda lakukan di shell.
Jika yang Anda kejar adalah menghindari ps
, itu sulit dilakukan di berbagai sistem mirip Unix ( ps
adalah API umum mereka untuk mendapatkan daftar proses, dalam arti tertentu). Tetapi jika Anda hanya memikirkan sistem mirip Unix tertentu (tidak memerlukan portabilitas lintas platform), itu mungkin; khususnya, di Linux, sistem file /proc
semu sangat membantu. Tetapi Anda harus mengklarifikasi persyaratan persis Anda sebelum kami dapat membantu di bagian terakhir ini.
psutil dapat menemukan proses dengan nama dan membunuhnya:
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, yang mungkin tidak ada di mesin target.
Jika Anda harus mempertimbangkan kasus Windows untuk menjadi lintas platform, coba yang berikut ini:
os.system('taskkill /f /im exampleProcess.exe')
Jika Anda memiliki killall:
os.system("killall -9 iChat");
Atau:
os.system("ps -C iChat -o pid=|xargs kill -9")
pkill
, meskipun saya pikir saya satu-satunya orang di dunia yang menggunakannya daripadakillall
killall java
?
pkill
karena satu-satunya yang killall
saya sadari adalah yang "bunuh semuanya".
Anda bisa mencobanya. tetapi sebelumnya Anda perlu menginstal psutil menggunakansudo pip install psutil
import psutil
for proc in psutil.process_iter(attrs=['pid', 'name']):
if 'ichat' in proc.info['name']:
proc.kill()
Kode di bawah ini akan mematikan semua program berorientasi 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)
Anda dapat menggunakan pkill <process_name>
sistem unix untuk menghentikan proses berdasarkan nama.
Maka kode pythonnya adalah:
>>> import os
>>> process_name=iChat
>>> os.system('pkill '+process_name)
Jika Anda ingin menghentikan proses atau cmd.exe yang membawa judul tertentu.
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 )
Semoga membantu. Mungkin ada banyak solusi yang lebih baik untuk saya.
Anda dapat menggunakan modul WMI untuk melakukan ini di windows, meskipun itu jauh lebih kikuk daripada yang biasa Anda gunakan untuk unix; import WMI
membutuhkan waktu lama dan ada rasa sakit menengah yang harus dihadapi dalam prosesnya.
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)
Jawaban Alex Martelli tidak akan berfungsi di Python 3 karena out
akan menjadi objek byte dan dengan demikian menghasilkan TypeError: a bytes-like object is required, not 'str'
saat pengujian if 'iChat' in line:
.
Mengutip dari dokumentasi subproses :
berkomunikasi () mengembalikan tupel (stdout_data, stderr_data). Data akan menjadi string jika aliran dibuka dalam mode teks; jika tidak, byte.
Untuk Python 3, ini diselesaikan dengan menambahkan text=True
(> = Python 3.7) atau universal_newlines=True
argumen ke Popen
konstruktor. out
kemudian akan dikembalikan sebagai objek 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)
Alternatifnya, Anda dapat membuat string menggunakan metode decode () 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)