我想要关闭一个进程(具体来说是iChat)。在命令行中,我使用以下命令:
ps -A | grep iChat
那么:
kill -9 PID
不过,我不太确定如何将这些命令翻译成Python。
psutil 能够通过进程名找到进程并将其终止:
import psutil
PROCNAME = "python.exe"
for proc in psutil.process_iter():
# check whether the process name matches
if proc.name() == PROCNAME:
proc.kill()
假设您使用的是类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
,但我不是特别喜欢那种风格,所以我宁愿用这种命名常量的方式。
当然,你可以在这些行上进行更复杂的处理,但这模仿了你在shell中所做的。
如果你想避免使用ps
,跨不同的类Unix系统可能很难(ps
是它们获取进程列表的公共API)。 但如果你只考虑特定的类Unix系统(不需要任何跨平台可移植性),那么可能是可行的;尤其是在Linux上,/proc
伪文件系统非常有帮助。 但在我们能够帮助你解决后面的问题之前,你需要更明确地阐明你的具体要求。
如果你需要考虑到跨平台的情况,包括 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
的人。 - Michael Mrozekkillall java
这样的代码,然后享受那种甜蜜的感觉呢? - Alois Mahdalpkill
,因为我知道的唯一一个 killall
是“杀死所有”的命令。 - Kyle Strandsudo pip install psutil
。import psutil
for proc in psutil.process_iter(attrs=['pid', 'name']):
if 'ichat' in proc.info['name']:
proc.kill()
这个在Windows 7里对我起作用了。
import subprocess
subprocess.call("taskkill /IM geckodriver.exe")
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)
psutil
模块按名称终止进程。在大多数情况下,这应该是跨平台的。import traceback
import psutil
def kill(process_name):
"""Kill Running Process by using it's name
- Generate list of processes currently running
- Iterate through each process
- Check if process name or cmdline matches the input process_name
- Kill if match is found
Parameters
----------
process_name: str
Name of the process to kill (ex: HD-Player.exe)
Returns
-------
None
"""
try:
print(f'Killing processes {process_name}')
processes = psutil.process_iter()
for process in processes:
try:
print(f'Process: {process}')
print(f'id: {process.pid}')
print(f'name: {process.name()}')
print(f'cmdline: {process.cmdline()}')
if process_name == process.name() or process_name in process.cmdline():
print(f'found {process.name()} | {process.cmdline()}')
process.terminate()
except Exception:
print(f"{traceback.format_exc()}")
except Exception:
print(f"{traceback.format_exc()}")
我基本上扩展了@Giampaolo Rodolà的答案。
我还将此片段发布为gist。
注意:一旦确认观察到所需的行为,您可以删除打印语句。
Process
获取进程对象。>>> import psutil
>>> p = psutil.Process(23442)
>>> p
psutil.Process(pid=23442, name='python3.6', started='09:24:16')
>>> p.kill()
>>>
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 )
希望这有所帮助。可能会有许多比我的更好的解决方案。
psutil
包,但目标计算机上可能没有该包。 - CadentOrange