2016-12-31 49 views
0

對於Windows 7 64位和psutil 5庫上的Python 3.5。Python 3 psutil,提取pid和名稱值?

我很困惑,如何正確地訪問名字和每個類的psutil.Process「由psutil.process_iter()返回項目內提供的PID信息。

以下代碼返回一個類的發電機'對象:

import psutil 
curProcesses = psutil.process_iter() 

一個簡單的循環輸出每個類'psutil.Process' 包含在該發電機內對象:

for eachProcess in curProcesses: 
    print(eachProcess) 

OUTPUT:

psutil.Process(pid=0, name='System Idle Process') 
psutil.Process(pid=4, name='System') 
      ... and so on ... 

現在,這裏是我變得困惑。

如果我改變了以前的循環如下的話,我會得到一個整數PID和一個字符串

for eachProcess in curProcesses: 
    # Observe the two different forms of access. 
    print(eachProcess.pid) 
    print(eachProcess.name()) 

OUTPUT:

0 
System Idle Process 
4 
System 
... and so on ... 

所得整數,字符串是我想要的東西。然而,經過多次實驗,我只能讓他們IF:

  • eachProcess.pid後面沒有括號ALA eachProcess.pid。 (添加括號產生類型錯誤: 'INT' 對象不是可調用例外。)

  • eachProcess.name後跟括號的ala eachProcess.name()。 (刪除括號返回綁定的方法Process.name代替的字符串名字。)

爲什麼這兩個關鍵字尋找論據不同的pid的行爲? (我懷疑我將要了解的Python 3發電機對象是非常有用的東西......)

回答

2

沒有太多真的:pid是一個只讀屬性(與@property裝飾創建),並name()是一種方法,都是Process這個類。爲了返回數據,方法需要調用parens,而沒有它們的情況下訪問屬性。 This bit of documentation可能會對您有所幫助。此外,如果您發現它有幫助,則可以看到name()pid之間的實施差異。

至於爲什麼pidProcess只讀屬性,而name()需要一種方法,以獲取進程的名稱叫,我不知道。事實上,pid似乎是進程類中唯一的只讀屬性,而有關流程實例的所有其他信息都是通過方法調用來檢索的。就個人而言,這樣做似乎不一致/不標準,但我認爲這是一個很好的理由。我認爲主要原因是PID不能意外改變,因爲它是一個關鍵組成部分。如果PID是一種方法而不是隻讀屬性,那麼循環中的eachProcess.pid = 123會將方法更改爲int 123,而按照當前的方式,此嘗試的重新分配會引發錯誤,因此將保護PID從某種意義上說,雖然eachProcess.name = 'foo'可能會通過而不會產生錯誤。

另外,還要注意的是,雖然他們可能看起來像關鍵字參數在它們出現在Process類實例的字符串表示的方式name()pid不是關鍵字參數(儘管pid可以作爲一個關鍵字參數創建Process時傳遞實例,但這不是發生在這裏)。

+0

是否有一種直接的方式可以知道生成器對象中返回的not-really-keyword-argument是隻讀屬性還是方法?或者,你必須走到比喻的窗簾後面,閱讀圖書館的代碼嗎? (或者像我一樣試驗,直到發電機對象咳嗽出所需的信息。) – RBV

+1

@RBV你最好的選擇總會是1)閱讀文檔,2)實驗。我通常會先與#2一起去,然後再去#1,如果我不能通過實驗來弄清楚它,那麼反過來也可能更安全。總是最好先閱讀文檔。如果文檔是好的,應該清楚某個方法或屬性是什麼,返回值是什麼,參數是什麼等等。上面爲'psutil'鏈接的文檔對您感興趣的屬性做了這些事情in。 – elethan

+1

如果一個屬性寫成一個不帶參數的方法,而不是一個屬性,這可能意味着它可能會做很多工作。屬性的代碼應該相當輕 - 不過比常規實例屬性查找更多。例如,對於Windows上的'name',初始查找必須遍歷系統上所有正在運行的進程的信息快照,直到它找到當前進程,因此它被實現爲方法調用。 – eryksun

1

我製作了pid一個類屬性/屬性,主要是爲了與subprocess.Popen.pidmultiprocessing.Process.pid stdlib模塊保持一致(也出現了threading.Thread.ident)。

此外,這是不需要任何計算(從name(),cmdline()等相反),它永遠不會改變,所以當時只讀對我來說更有意義。

這是一個屬性而不僅僅是一個屬性,只是在用戶嘗試更改/設置時出錯。