Я пытаюсь убить процесс (а именно iChat). В командной строке я использую следующие команды:
ps -A | grep iChat
Затем:
kill -9 PID
Однако я не совсем уверен, как перевести эти команды на Python.
Ответы:
Предполагая, что вы используете 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()
Приведенный ниже код уничтожит все программы, ориентированные на 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)
Ты можешь использовать 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 )
Надеюсь, поможет. Их может быть множество лучших решений для моей.
9 представляет сигнал SIGKILL. Таким образом, вы можете использовать KILL
вместо 9
os.system("kill -s KILL 1234")
0r
os.sytem("kill -KILL 1234")
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:
.
Цитата из документации подпроцесса :
communication () возвращает кортеж (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)