Bir süreci (özellikle iChat'i) öldürmeye çalışıyorum. Komut satırında şu komutları kullanıyorum:
ps -A | grep iChat
Sonra:
kill -9 PID
Ancak, bu komutları Python'a nasıl çevireceğimden tam olarak emin değilim.
Yanıtlar:
Unix benzeri bir platformda olduğunuzu varsayarsak (öyle ki ps -A
var),
>>> import subprocess, signal
>>> import os
>>> p = subprocess.Popen(['ps', '-A'], stdout=subprocess.PIPE)
>>> out, err = p.communicate()
değişkendeki (bir dizge) ps -A
çıktısını verir out
. Bunu satırlara ayırabilir ve üzerlerinde döngü yapabilirsiniz ...:
>>> for line in out.splitlines():
... if 'iChat' in line:
... pid = int(line.split(None, 1)[0])
... os.kill(pid, signal.SIGKILL)
...
(ithal etmekten kaçınabilir signal
ve 9
yerine kullanabilirsiniz signal.SIGKILL
, ancak bu stili özellikle sevmiyorum, bu yüzden adlandırılmış sabiti bu şekilde kullanmayı tercih ettim).
Elbette bu hatlar üzerinde çok daha karmaşık işlemler yapabilirsiniz, ancak bu, kabukta yaptığınız şeyi taklit eder.
Peşinde olduğunuz şey kaçınmaksa ps
, bunu farklı Unix benzeri sistemlerde yapmak zordur ( ps
bir anlamda işlem listesi almak için ortak API'larıdır). Ancak aklınızda belirli bir Unix benzeri sistem varsa, yalnızca (platformlar arası taşınabilirlik gerektirmeyen) bu mümkün olabilir; özellikle Linux'ta /proc
sözde dosya sistemi çok faydalıdır. Ancak bu ikinci bölümde yardımcı olabilmemiz için önce tam olarak gereksinimlerinizi netleştirmeniz gerekecek.
psutil işlemi isme göre bulabilir ve öldürebilir:
import psutil
PROCNAME = "python.exe"
for proc in psutil.process_iter():
# check whether the process name matches
if proc.name() == PROCNAME:
proc.kill()
psutil
, hedef makinede bulunmayabilecek paketi gerektirmesidir .
Çapraz platform olması için Windows durumunu göz önünde bulundurmanız gerekiyorsa, aşağıdakileri deneyin:
os.system('taskkill /f /im exampleProcess.exe')
Killall varsa:
os.system("killall -9 iChat");
Veya:
os.system("ps -C iChat -o pid=|xargs kill -9")
pkill
, bunu dünyada kullanan tek kişi olduğumu düşünmeme rağmenkillall
killall java
?
pkill
çünkü tek killall
farkında olduğum "her şeyi öldür" idi.
Bunu deneyebilirsin. ancak psutil'i kullanarak yüklemeniz gerekmeden öncesudo 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>
Bir unix sisteminde işlemi isme göre öldürmek için kullanabilirsiniz .
O zaman python kodu şöyle olacaktır:
>>> import os
>>> process_name=iChat
>>> os.system('pkill '+process_name)
İşlemleri veya belirli bir başlığı / başlıkları taşıyan cmd.exe'yi öldürmek istiyorsanız.
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 )
Umarım yardımcı olur. Benim için sayısız daha iyi çözümler olabilir.
Alex Martelli cevabı Python 3'te çalışmayacaktır çünkü out
bir bayt nesnesi olacaktır ve bu nedenle TypeError: a bytes-like object is required, not 'str'
test sırasında bir sonuç olacaktır if 'iChat' in line:
.
Alt işlem belgelerinden alıntı yapma :
communication () bir demet döndürür (stdout_data, stderr_data). Akışlar metin modunda açılmışsa veriler dizeler olacaktır; aksi takdirde bayt.
Python 3 için bu, yapıcıya text=True
(> = Python 3.7) veya universal_newlines=True
argüman eklenerek çözülür Popen
. out
daha sonra bir dizge nesnesi olarak döndürülür.
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)
Alternatif olarak, baytların decode () yöntemini kullanarak bir dize oluşturabilirsiniz.
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)
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)