【问题标题】:Kill all python main processes apart from current one杀死除当前一个之外的所有python主进程
【发布时间】:2015-09-22 09:20:30
【问题描述】:

考虑以下脚本:

import matplotlib.pyplot as plt

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

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

这是我的方法:

  1. os获取当前进程ID
  2. 使用psutil获取与python相关的所有进程ID
  3. 从所有 python ID 中过滤掉当前 ID
  4. 杀死剩余的 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(最近一次调用最后一次):文件“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 64位(AMD64)]在win32上

【问题讨论】:

    标签: python process


    【解决方案1】:

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

    os.kill(PyId, signal.SIGTERM)
    

    您也可以考虑使用signal.SIGINT

    【讨论】:

    • 我从该主题的其他答案中得到了 1,它似乎有效。感谢您的提示!
    • 不客气。让这成为一个教训:不要硬编码幻数。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-01-25
        • 2014-11-04
        • 1970-01-01
        • 2016-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-19
        相关资源
        最近更新 更多