2016-12-31 4 views
0

Für Python 3.5 unter Windows 7 64-Bit und die Psutil 5-Bibliothek.Python 3 psutil, pid und name Werte extrahieren?

Ich bin verwirrt, wie richtig den Namen und die pid Informationen zugreifen innerhalb jeder Klasse ‚psutil.Process‘ versehen Artikel von psutil.process_iter() zurück.

Der folgende Code gibt ein Klasse 'Generator' Objekt:

import psutil 
curProcesses = psutil.process_iter() 

eine einfache Schleife Ausgänge jede Klasse 'psutil.Process' Objekt innerhalb dieses Generators enthalten:

for eachProcess in curProcesses: 
    print(eachProcess) 

AUSGABE:

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

Jetzt ist hier, wo ich verwirrt bin.

Wenn ich die vorherigen Schleife wie folgt ändern, dann werde ich eine ganze Zahl erhalten pid und einen String Namen.

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 ... 

Die resultierende Integer und String sind genau das, was ich will. Doch nach einigen Versuchen kann ich sie nur, wenn:

  • eachProcess.pid NICHT durch Klammern ala eachProcess.pid folgt. (Die in Klammern Hinzufügen erzeugt ein Typeerror: 'int' Objekt nicht aufrufbaren Ausnahme.)

  • eachProcess.name wird gefolgt von Klammern ala eachProcess.name(). (Die Klammern Entfernen gibt eine gebunden Methode Process.name anstelle der Namen als String.)

Warum die beide Keyword-Suche Argumente und Namen anders verhalten pid? (Ich bin ich zu vermuten, dass etwas sehr nützlich, um Python zu lernen 3 Generator-Objekte ...)

Antwort

2

Es gibt nicht viel, um es wirklich: pid ist ein read-only-Attribut (erstellt mit dem @property Dekorateur) und name() ist eine Methode, beide der Process Klasse. Methoden müssen Parens aufgerufen werden, um Daten zurückzugeben, während Attribute ohne sie abgerufen werden. This bit of documentation könnte hilfreich sein. Auch wenn Sie es hilfreich finden, können Sie den Unterschied in der Implementierung zwischen name() und pid sehen.

Soweit warumpid ein read-only-Attribut von Process ist, während ein Verfahren name(), um aufgerufen werden muss die Prozessnamen zu bekommen, bin ich nicht sicher. Tatsächlich scheint pid die einzige schreibgeschützte attrubute für die Prozessklasse zu sein, während alle anderen Informationen über die Prozessinstanz durch Methodenaufrufe abgerufen werden. Persönlich scheint es inkonsequent/nicht standardgemäß, dies zu tun, aber ich nehme an, dass es einen guten Grund für diese Wahl gibt. Ich nehme an, der Hauptgrund ist, dass die PID nicht versehentlich geändert werden kann, da es eine entscheidende Komponente ist. Wenn die PID eine Methode anstelle eines schreibgeschützten Attributs wäre, würde eachProcess.pid = 123 in Ihrer Schleife die Methode in int 123 ändern, während die versuchte Neuzuweisung stattdessen einen Fehler verursacht, so dass die PID geschützt ist in gewissem Sinne, während eachProcess.name = 'foo' wird wahrscheinlich ohne einen Fehler zu gehen gehen.

Beachten Sie auch, dass, während sie wie Keyword-Argumente in der Art und Weise aussehen können sie in den String-Darstellungen von Process Klasseninstanzen erscheinen, name() und pid sind nicht Schlüsselwort-Argumente (obwohl pid kann als Schlüsselwort-Argument übergeben werden, wenn ein Process Schaffung Beispiel, aber das ist nicht, was hier passiert).

+0

Gibt es eine einfache Möglichkeit zu wissen, dass ein nicht-wirklich-Schlüsselwort-Argument zurückgegeben in einem Generator-Objekt ein schreibgeschütztes Attribut gegenüber einer Methode ist? Oder muss man hinter den figurativen Vorhang gehen und den Code der Bibliothek lesen? (Oder experimentieren Sie wie ich, bis das Generator-Objekt die gewünschten Informationen ausgibt.) – RBV

+1

@RBV Ihre beste Wette ist immer 1) Lesen Sie die Dokumentation und 2) experimentieren Sie. Ich gehe normalerweise zuerst mit # 2 und dann mit # 1, wenn ich es durch Experimente nicht herausfinden kann - es ist wahrscheinlich sicherer, es andersherum zu machen. Lesen Sie immer zuerst die Dokumentation. Wenn die Dokumente gut sind, sollte klar sein, ob etwas eine Methode oder ein Attribut ist, was der Rückgabewert ist, was die Argumente sind usw. Die oben verlinkten Dokumente für 'psutil' machen diese Dinge in Bezug auf die Eigenschaften, die Sie interessieren in. – elethan

+1

Wenn ein Attribut als eine Methode geschrieben wird, die keine Argumente entgegennimmt, im Gegensatz zu einer Eigenschaft, bedeutet dies wahrscheinlich, dass es möglicherweise viel Arbeit verrichtet. Der Code für Eigenschaften sollte ziemlich hell sein - nicht viel mehr als eine normale Suche nach Instanzattributen. Zum Beispiel muss für "Name" unter Windows die anfängliche Suche eine Momentaufnahme von Informationen über alle laufenden Prozesse auf dem System durchlaufen, bis sie den aktuellen Prozess findet, so dass sie als Methodenaufruf implementiert wird. – eryksun

1

Ich habe pid eine Klasse Attribut/Eigenschaft vor allem für die Konsistenz mit subprocess.Popen.pid und multiprocessing.Process.pid stdlib Module (auch threading.Thread.ident den Sinn kommt).

Es ist auch etwas, das keine Berechnung erfordert (im Gegensatz von name(), cmdline() usw.) und es ändert sich nie, so dass etwas schreibgeschützt zu der Zeit mehr Sinn für mich machte.

Es ist eine Eigenschaft und nicht nur ein Attribut, nur um Fehler zu vermeiden, falls der Benutzer versucht, sie zu ändern/einzustellen.

Verwandte Themen