2014-10-29 43 views
3

我在windows 8.1上的python 64位上使用psutil 2.1.2。我使用psutil.process_iter()遍歷正在運行的進程以獲取特定進程的詳細信息。由於某種原因,我不明白,即使它顯示在任務管理器的進程和Process Explorer的psutil.process_iter()不會返回所有正在運行的進程

for proc in psutil.process_iter(): 
    try: 
     if proc.name() == 'svchost.exe': # patch for debugging 
      pass #script never gets here 
     opened_files = proc.open_files() 
     opened_files = [opened_file[0] for opened_file in opened_files] 
     if file_path in opened_files: 
      processes.append(proc) 
    except (psutil.AccessDenied, psutil.NoSuchProcess): 
     pass 

我檢查了PROC名稱,這是從來沒有我在尋找的過程。 我看不到的過程的一個例子是svchost.exe

感謝您的幫助!

+0

從另一個方向看,使用從psutil.pids()獲得的進程PID。 'psutil.Process(pid).open_files()'產生'psutil.AccessDenied'。在proc對象中,這個PID的BTW進程名稱爲None。有沒有辦法解決這個問題? – 2014-10-29 14:49:48

回答

2

對於一些(實際上很多)進程proc.open_files()將導致AccessDenied異常,所以可能這就是爲什麼你不「看到」所有進程。任務管理器和Process Explorer比psutil顯示更多信息,因爲它們具有較少的權限限制(請參閱:他們可以從進程中「提取」更多信息而不會碰到「訪問被拒絕」錯誤)。通過使用psutil,您可以看到所有進程(PID),但只有您不能「查詢」所有這些進程。

+0

我在代碼中添加了2行 - 儘管svchost.exe正在系統上運行,但腳本永遠不會達到這一點。所以我不確定proc.open_files()是否是責任。 它看起來像psutil.process_iter()不會返回所有的進程... – 2014-10-29 13:39:48

+0

proc.name()也可以提高AccessDenied。如果你說的是真的(process_iter()不返回所有的進程),那麼「len(psutil.pids())」應該與「len(list(psutil.process_iter())」不同。 – 2014-10-29 15:05:09

+0

好吧,它們是相同的我認爲我沒有看到這個過程(或者停止在那個地方)的原因是我在使用PID時看到的進程名是'None',所以if是False,也許''open_files()'只是捕捉異常而無所作爲? – 2014-10-29 15:48:29

相關問題