2009-02-15 11 views
45

Mehrere Prozesse mit demselben Namen werden auf dem Host ausgeführt. Was ist der plattformübergreifende Weg, um PIDs dieser Prozesse namentlich unter Verwendung python oder jython zu erhalten?Plattformübergreifende Methode zum Abrufen von PIDs nach Prozessnamen in Python

  1. Ich möchte etwas wie pidof aber in Python. (Ich habe sowieso keine pidof.)
  2. Ich kann /proc nicht analysieren, da es möglicherweise nicht verfügbar ist (unter HP-UX).
  3. Ich möchte os.popen('ps') nicht laufen lassen und die Ausgabe analysieren, weil ich denke, dass es hässlich ist (Feldfolge kann in unterschiedlichem OS unterschiedlich sein).
  4. Zielplattformen sind Solaris, HP-UX und möglicherweise andere.

Antwort

61

Sie können psutil (https://github.com/giampaolo/psutil) verwenden, die unter Windows und UNIX arbeitet:

import psutil 

PROCNAME = "python.exe" 

for proc in psutil.process_iter(): 
    if proc.name() == PROCNAME: 
     print(proc) 

Auf meiner Maschine druckt:

<psutil.Process(pid=3881, name='python.exe') at 140192133873040> 

BEARBEITEN 2017-04-27 - hier ist eine erweiterte Dienstprogrammfunktion, die den Namen gegen processes name(), cmdline() und exe() überprüft:

+0

Sie haben ein sehr nützliches Modul gemacht. Vielen Dank. –

+0

Wenige Klicks und ich bin fertig (sogar in Windows). Groß. –

+1

OS X erlaubt leider nicht den Zugriff auf viele Attribute eines Prozesses (name, exe, cmdline), auch wenn Sie nur versuchen, auf die von Ihnen erstellten Prozesse zuzugreifen. Es sei denn, Sie führen den Interpreter/das Skript mit sudo aus. – John

3

Ich glaube nicht, dass Sie in der Lage sein werden, eine reine Python-basierte, portable Lösung ohne/proc oder Befehlszeilen-Dienstprogramme zu finden, zumindest nicht in Python selbst. Parsen von os.system ist nicht hässlich - jemand muss sich mit den verschiedenen Plattformen auseinandersetzen, sei es Sie oder jemand anderes. Die Implementierung für das Betriebssystem, an dem Sie interessiert sind, sollte ziemlich einfach und ehrlich sein.

3

Erstens, Windows (in allen seinen Inkarnationen) ist ein Nicht-Standard-Betriebssystem.

Linux (und die meisten proprietären Unixen) sind POSIX-kompatible Standardbetriebssysteme.

Die C-Bibliotheken widerspiegeln diese Dichotomie. Python spiegelt die C-Bibliotheken wider.

Es gibt keine "plattformübergreifende" Möglichkeit, dies zu tun. Sie müssen etwas mit ctypes für eine bestimmte Version von Windows (XP oder Vista) hacken

+0

ein Beispiel wäre willkommen, sowie Links zu Dokumenten – n611x007

1

Es gibt nicht, fürchte ich. Prozesse werden eindeutig durch pid identifiziert, nicht durch den Namen. Wenn Sie wirklich eine PID mit Namen finden müssen, dann werden Sie etwas verwenden, wie Sie es vorgeschlagen haben, aber es wird nicht tragbar sein und wird wahrscheinlich nicht in allen Fällen funktionieren.

Wenn Sie nur die PIDs für eine bestimmte Anwendung finden müssen und Sie die Kontrolle über diese Anwendung haben, würde ich vorschlagen, diese App zu ändern, um ihre PID in Dateien an einem Ort zu speichern, wo Ihr Skript es finden kann.

1

Für jython, wenn Java 5 verwendet wird, dann können Sie den Java-Prozess-ID erhalten, wie folgend:

von java.lang.management import *
pid = ManagementFactory.getRuntimeMXBean() getName()

.
+0

, die funktioniert, aber ich möchte PID von einem anderen Prozess (wie Pidof tun, aber ohne Pidof) –

11

Da es keine plattformübergreifende API gibt, müssen Sie nach dem Betriebssystem suchen. Für posix basierte Verwendung/proc. Für Windows-Anwendung folgenden Code Liste aller PIDs mit coresponding Prozessnamen können

from win32com.client import GetObject 
WMI = GetObject('winmgmts:') 
processes = WMI.InstancesOf('Win32_Process') 
process_list = [(p.Properties_("ProcessID").Value, p.Properties_("Name").Value) for p in processes] 

Sie dann Prozesse leicht zu bekommen herauszufiltern Sie benötigen. Für weitere Informationen über verfügbare Immobilien von Win32_Process Besuche Win32_Process Class

+0

Diese Bibliothek ist nicht Standard mit Python, zumindest nicht mit 2.7. Habe die anderen Versionen nicht überprüft. –

+1

@ZoranPavlovic ja und es ist das 'pywin32' Paket mit Builds http://sourceforge.net/projects/pywin32/files/pywin32/ sollte die Antwort enthalten sein – n611x007

7
import psutil 

process = filter(lambda p: p.name() == "YourProcess.exe", psutil.process_iter()) 
for i in process: 
    print i.name,i.pid 

Geben Sie alle PIDs von "YourProcess.exe"

+1

Ich halte keinen Pfahl in beide Richtungen; Ich höre oft Leute schimpfen, dass List Comprehension ist * immer * der beste Weg, um eine Liste zu filtern, weil es schneller ist. zB 'process = [proc für proc in psutil.process_iter() wenn proc.name ==" YourProcess.exe "]'. – ThorSummoner

0

Ein Hinweis auf ThorSummoner's comment

process = [proc for proc in psutil.process_iter() if proc.name == "YourProcess.exe"]. 

ich es auf Debian mit Python 3 versucht haben, ich glaube, es proc.name() sein muss statt von proc.name.

Verwandte Themen