杀死除当前进程之外的所有 python 个主进程
Kill all python main processes apart from current one
考虑以下脚本:
import matplotlib.pyplot as plt
plt.plot([1,2,3], [1,2,3])
plt.show()
每次你 运行 它,它都会在新的 python.exe 进程中创建一个新图形,如果你之前没有关闭图形。但是我想关闭所有以前打开的图形(这只是一个例子,请不要使用matplotlib解决方案),意味着所有以前打开的进程。
这是我的方法:
- 使用
os
获取当前进程ID
- 获取与 python 和
psutil
相关的所有进程 ID
- 从所有 python 个 ID 中过滤掉当前 ID
- 杀死剩余的 ID 列表
import os
currentId = os.getpid()
import psutil
allPyIds = [p.pid for p in psutil.process_iter() if "python" in str(p.name)]
PyIdsToKill = [x for x in allPyIds if x != currentId]
for PyId in PyIdsToKill:
os.kill(PyId, 1)
它起作用了,它关闭了除当前进程之外的所有打开的 python 进程。
但是,当实际有进程要关闭时,我收到以下错误:
Traceback (most recent call last): File "C:....py", line 10, in
for PyId in PyIdsToKill: OSError: [WinError 87] Falscher Parameter [Finished in 0.3s with exit code 1]
我的错误是什么?
我正在 运行宁 Windows 7 Pro:
Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:44:40) [MSC v.1600
64 bit (AMD64)] on win32
如果不追求跨平台兼容性,也可以使用taskkill:
Is it possible to kill a process on Windows from within Python?
import os
PyIds = [int(line.split()[1]) for line in os.popen('tasklist').readlines()[3:] if line.split()[0] == "python.exe"]
PyIdsToKill = [id for id in PyIds if id != os.getpid()]
for pid in PyIdsToKill:
os.system("taskkill /pid %i" % pid)
您已将信号 1
硬编码到 os.kill
中。 1
应该是什么?在 Unix 上它将是 SIGHUP
但在 Windows 上没有这样的东西。我建议使用 signal
模块中定义的常量,如下所示:
os.kill(PyId, signal.SIGTERM)
您也可以考虑使用 signal.SIGINT
。
不确定这是否对您有帮助,但我设法通过获取 pid 杀死了除当前进程之外的所有进程,但是当我 运行 来自 atom 的代码时,有 2 个进程启动。所以我还必须按日期匹配 PID 不匹配的日期。
编码愉快。
import re, datetime, psutil, os
print('current process: '+str(os.getpid()))
for process in psutil.process_iter():
if str(process.pid) == str(os.getpid()):
current_started = re.findall(r'\d{1,2}:\d{1,2}:\d{1,2}', str(process))[0]
for process in psutil.process_iter():
if "python.exe" in str(process.name):
if str(process.pid) != str(os.getpid()):
if str(current_started)!= re.findall(r'\d{1,2}:\d{1,2}:\d{1,2}', str(process))[0]:
os.system("Taskkill /PID "+str(process.pid)+"")
考虑以下脚本:
import matplotlib.pyplot as plt
plt.plot([1,2,3], [1,2,3])
plt.show()
每次你 运行 它,它都会在新的 python.exe 进程中创建一个新图形,如果你之前没有关闭图形。但是我想关闭所有以前打开的图形(这只是一个例子,请不要使用matplotlib解决方案),意味着所有以前打开的进程。
这是我的方法:
- 使用
os
获取当前进程ID
- 获取与 python 和
psutil
相关的所有进程 ID
- 从所有 python 个 ID 中过滤掉当前 ID
- 杀死剩余的 ID 列表
import os
currentId = os.getpid()
import psutil
allPyIds = [p.pid for p in psutil.process_iter() if "python" in str(p.name)]
PyIdsToKill = [x for x in allPyIds if x != currentId]
for PyId in PyIdsToKill:
os.kill(PyId, 1)
它起作用了,它关闭了除当前进程之外的所有打开的 python 进程。 但是,当实际有进程要关闭时,我收到以下错误:
Traceback (most recent call last): File "C:....py", line 10, in for PyId in PyIdsToKill: OSError: [WinError 87] Falscher Parameter [Finished in 0.3s with exit code 1]
我的错误是什么?
我正在 运行宁 Windows 7 Pro:
Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:44:40) [MSC v.1600 64 bit (AMD64)] on win32
如果不追求跨平台兼容性,也可以使用taskkill:
Is it possible to kill a process on Windows from within Python?
import os
PyIds = [int(line.split()[1]) for line in os.popen('tasklist').readlines()[3:] if line.split()[0] == "python.exe"]
PyIdsToKill = [id for id in PyIds if id != os.getpid()]
for pid in PyIdsToKill:
os.system("taskkill /pid %i" % pid)
您已将信号 1
硬编码到 os.kill
中。 1
应该是什么?在 Unix 上它将是 SIGHUP
但在 Windows 上没有这样的东西。我建议使用 signal
模块中定义的常量,如下所示:
os.kill(PyId, signal.SIGTERM)
您也可以考虑使用 signal.SIGINT
。
不确定这是否对您有帮助,但我设法通过获取 pid 杀死了除当前进程之外的所有进程,但是当我 运行 来自 atom 的代码时,有 2 个进程启动。所以我还必须按日期匹配 PID 不匹配的日期。
编码愉快。
import re, datetime, psutil, os
print('current process: '+str(os.getpid()))
for process in psutil.process_iter():
if str(process.pid) == str(os.getpid()):
current_started = re.findall(r'\d{1,2}:\d{1,2}:\d{1,2}', str(process))[0]
for process in psutil.process_iter():
if "python.exe" in str(process.name):
if str(process.pid) != str(os.getpid()):
if str(current_started)!= re.findall(r'\d{1,2}:\d{1,2}:\d{1,2}', str(process))[0]:
os.system("Taskkill /PID "+str(process.pid)+"")