2015-09-22 48 views
2

除了過程請看下面的代碼:你運行它殺死所有蟒主要從當前

import matplotlib.pyplot as plt 

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

每次,它會創建一個新的python.exe進程中的一個新的數字,如果你不關閉之前的數字。但是我想關閉所有之前打開的數據(這只是一個例子,請不要使用matplotlib解決方案),意味着所有以前打開的流程。

這是我的方法:

  1. 獲取當前進程ID與os
  2. 獲得有關蟒蛇所有進程ID與psutil
  3. 過濾掉電流ID從所有的Python標識
  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 (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專業版上運行:

Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:44:40) [MSC v.1600 64 bit (AMD64)] on win32

回答

1

您已對中的信號1進行硬編碼。 1應該是什麼?在Unix上它會是SIGHUP,但Windows上沒有這種東西。我建議使用signal模塊中定義的常量,比如:

os.kill(PyId, signal.SIGTERM) 

你也可以考慮使用signal.SIGINT

+0

我從這個話題的其他答案得到** 1 **,它似乎工作。感謝提示! – thewaywewalk

+1

不客氣。讓這是一個教訓:不要硬編碼幻數。 –

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)