杀死当前的所有python主进程

时间:2015-09-22 09:20:30

标签: python process

考虑以下脚本:

import matplotlib.pyplot as plt

plt.plot([1,2,3], [1,2,3])
plt.show()

每次运行它时,如果你之前没有关闭数字,它会在新的 python.exe 进程中创建一个新数字。但我想关闭所有以前的开放数据(这只是一个例子,请不要使用matplotlib解决方案),这意味着所有以前打开的流程。

这是我的方法:

  1. 使用os
  2. 获取当前进程ID
  3. 使用psutil
  4. 获取与 python 相关的所有流程ID
  5. 过滤掉所有python ID中的当前ID
  6. 杀死剩余的ID列表
  7. 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进程。 但是,当实际关闭进程时,我收到以下错误:

      

    回溯(最近一次调用最后一次):文件“C:.... py”,第10行,中          PyIdsToKill中的PyId:OSError:[WinError 87] Falscher参数[以0.3秒完成退出代码1]

    我的错误是什么?

    我在Windows 7 Pro上运行:

      

    Python 3.4.3(v3.4.3:9b73f1c3e601,2015年2月24日,22:44:40)[MSC v.1600   win32上的64位(AMD64)]

3 个答案:

答案 0 :(得分:1)

如果您的目标不是跨平台兼容性,也可以使用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 :(得分:1)

您已在UITableView中对信号1进行了硬编码。什么是os.kill应该是什么?在Unix上它将是1但在Windows上没有这样的东西。我建议使用SIGHUP模块中定义的常量,如下所示:

signal

您还可以考虑使用os.kill(PyId, signal.SIGTERM)

答案 2 :(得分:0)

不确定这是否对您有帮助,但是我设法通过获取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)+"")