Câu trả lời:
Giả sử bạn đang sử dụng một nền tảng giống Unix (để ps -Atồ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 outbiế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 signalvà sử dụng 9thay 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 ( pstheo 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, /prochệ 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()
psutilgó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?
pkillvì điều duy nhất killalltô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ì outnó 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 Popentạo. outsau đó 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)