回答:
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
疑似ファイルシステムが非常に役立ちます。ただし、この後半の部分を支援する前に、正確な要件を明確にする必要があります。
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()
特定のタイトルを持つプロセスまたは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)
Alex Martelliの回答はPython 3では機能しません。これout
は、バイトオブジェクトになるため、TypeError: a bytes-like object is required, not 'str'
テスト時にa になるため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)