Câu trả lời:
Giả sử bạn đang sử dụng một nền tảng giống Unix (để ps -A
tồn tại),
>>> import subprocess, signal
>>> import os
>>> p = subprocess.Popen(['ps', '-A'], stdout=subprocess.PIPE)
>>> out, err = p.communicate()
cung cấp cho bạn ps -A
đầu ra trong out
biến (một chuỗi). Bạn có thể chia nhỏ nó thành các dòng và lặp lại chúng ...:
>>> for line in out.splitlines():
... if 'iChat' in line:
... pid = int(line.split(None, 1)[0])
... os.kill(pid, signal.SIGKILL)
...
(bạn có thể tránh nhập signal
và sử dụng 9
thay thế signal.SIGKILL
, nhưng tôi không đặc biệt thích kiểu đó, vì vậy tôi muốn sử dụng hằng được đặt tên theo cách này).
Tất nhiên, bạn có thể xử lý phức tạp hơn nhiều trên những đường này, nhưng điều này bắt chước những gì bạn đang làm trong shell.
Nếu những gì bạn đang theo đuổi đang tránh ps
, điều đó khó thực hiện trên các hệ thống giống Unix khác nhau ( ps
theo một nghĩa nào đó là API chung của chúng để lấy danh sách quy trình). Nhưng nếu bạn có ý nghĩ về một hệ thống giống Unix cụ thể (không yêu cầu bất kỳ tính di động đa nền tảng nào), thì có thể; đặc biệt, trên Linux, /proc
hệ thống tập tin giả rất hữu ích. Nhưng bạn sẽ cần làm rõ các yêu cầu chính xác của mình trước khi chúng tôi có thể trợ giúp về phần sau này.
psutil có thể tìm thấy quá trình theo tên và giết nó:
import psutil
PROCNAME = "python.exe"
for proc in psutil.process_iter():
# check whether the process name matches
if proc.name() == PROCNAME:
proc.kill()
psutil
gói, có thể không có trên máy đích.
Nếu bạn phải xem xét trường hợp Windows để trở thành đa nền tảng, hãy thử các cách sau:
os.system('taskkill /f /im exampleProcess.exe')
Nếu bạn có killall:
os.system("killall -9 iChat");
Hoặc là:
os.system("ps -C iChat -o pid=|xargs kill -9")
pkill
, mặc dù tôi nghĩ rằng tôi là người duy nhất trên thế giới sử dụng nó thay vìkillall
killall java
?
pkill
vì điều duy nhất killall
tôi biết là "giết mọi thứ".
Bạn có thể thử điều này. nhưng trước khi bạn cần cài đặt psutil bằng cách sử dụngsudo pip install psutil
import psutil
for proc in psutil.process_iter(attrs=['pid', 'name']):
if 'ichat' in proc.info['name']:
proc.kill()
Đoạn mã dưới đây sẽ giết tất cả các chương trình định hướng 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)
Bạn có thể sử dụng pkill <process_name>
trong một hệ thống unix để giết quá trình theo tên.
Sau đó, mã python sẽ là:
>>> import os
>>> process_name=iChat
>>> os.system('pkill '+process_name)
Nếu bạn muốn hủy (các) tiến trình hoặc cmd.exe mang (các) tiêu đề cụ thể.
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 )
Hy vọng nó giúp. Chúng có thể là nhiều giải pháp tốt hơn cho tôi.
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)
Câu trả lời Alex Martelli sẽ không hoạt động trong Python 3 vì out
nó sẽ là một đối tượng byte và do đó dẫn đến TypeError: a bytes-like object is required, not 'str'
khi kiểm tra if 'iChat' in line:
.
Trích dẫn từ tài liệu quy trình con :
Communication () trả về một tuple (stdout_data, stderr_data). Dữ liệu sẽ là chuỗi nếu các luồng được mở ở chế độ văn bản; ngược lại, byte.
Đối với Python 3, điều này được giải quyết bằng cách thêm text=True
(> = Python 3.7) hoặc universal_newlines=True
đối số vào hàm Popen
tạo. out
sau đó sẽ được trả về dưới dạng một đối tượng chuỗi.
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)
Ngoài ra, bạn có thể tạo một chuỗi bằng cách sử dụng phương thức 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)