Відповіді:
Припустимо, що ви перебуваєте на платформі, схожій на Unix (так, що ps -A
існує),
>>> import subprocess, signal
>>> import os
>>> p = subprocess.Popen(['ps', '-A'], stdout=subprocess.PIPE)
>>> out, err = p.communicate()
дає ps -A
вихід у out
змінну (рядок). Ви можете розбити їх на рядки та нанести на них цикл ...:
>>> for line in out.splitlines():
... if 'iChat' in line:
... pid = int(line.split(None, 1)[0])
... os.kill(pid, signal.SIGKILL)
...
(ви можете уникнути імпорту signal
та використання 9
замість signal.SIGKILL
, але мені просто не дуже подобається такий стиль, тому я б скоріше використовував іменовану константу таким чином).
Звичайно, ви можете зробити набагато складнішу обробку на цих рядках, але це імітує те, що ви робите в оболонці.
Якщо ви цього уникаєте ps
, цього важко зробити для різних систем, схожих на Unix ( ps
це певний API для отримання списку процесів у певному сенсі). Але якщо ви маєте на увазі лише конкретну систему, схожу на Unix (не вимагаючи переносимості між платформами), можливо, це можливо; зокрема, в Linux /proc
дуже допомагає псевдофайлова система. Але вам потрібно буде уточнити ваші точні вимоги, перш ніж ми зможемо допомогти в цій останній частині.
psutil може знайти процес за іменем і вбити його:
import psutil
PROCNAME = "python.exe"
for proc in psutil.process_iter():
# check whether the process name matches
if proc.name() == PROCNAME:
proc.kill()
psutil
пакет, який може бути відсутнім на цільовій машині.
Якщо вам потрібно розглянути справу Windows, щоб бути платформою, то спробуйте наступне:
os.system('taskkill /f /im exampleProcess.exe')
Якщо у вас є killall:
os.system("killall -9 iChat");
Або:
os.system("ps -C iChat -o pid=|xargs kill -9")
pkill
, хоча я думаю, що я єдина людина в світі, яка використовує його замістьkillall
killall java
?
pkill
тому що єдине, про що killall
я знав, - це "вбити все".
Ви можете спробувати це. але перш ніж вам потрібно встановити psutil за допомогоюsudo pip install psutil
import psutil
for proc in psutil.process_iter(attrs=['pid', 'name']):
if 'ichat' in proc.info['name']:
proc.kill()
Ви можете використовувати pkill <process_name>
в системі Unix, щоб вбити процес за іменем.
Тоді код python буде таким:
>>> import os
>>> process_name=iChat
>>> os.system('pkill '+process_name)
Якщо ви хочете вбити процес (и) або cmd.exe з певними заголовками.
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 )
Сподіваюся, це допомагає. Вони можуть бути численними кращими рішеннями для шахти.
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)
Відповідь Алекса Мартеллі не працюватиме в Python 3, тому що out
буде об’єктом байтів і, таким чином, призведе до TypeError: a bytes-like object is required, not 'str'
тестуванняif 'iChat' in line:
.
Цитування з підпроцесорної документації :
commun () повертає кортеж (stdout_data, stderr_data). Дані будуть рядками, якщо потоки були відкриті в текстовому режимі; інакше байти.
Для Python 3 це вирішується додаванням text=True
(> = Python 3.7) або 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)
Крім того, ви можете створити рядок, використовуючи метод байтів decode ().
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)