Cross-Plattform Weg, um PIDs nach Prozessnamen in Python zu bekommen

Mehrere Prozesse mit dem gleichen Namen laufen auf Host. Was ist die plattformübergreifende Möglichkeit, PIDs dieser Prozesse namentlich mit Python oder Jython zu bekommen ?

  1. Ich möchte etwas wie pidof aber in Python. (; Ich habe sowieso kein pidof .)
  2. Ich kann nicht analysieren, weil es nicht verfügbar ist (auf HP-UX).
  3. Ich möchte nicht os.popen('ps') laufen und die Ausgabe analysieren, weil ich denke, dass es hässlich ist ( os.popen('ps') kann in verschiedenen OS unterschiedlich sein).
  4. Zielplattformen sind Solaris, HP-UX und vielleicht andere.

8 Solutions collect form web for “Cross-Plattform Weg, um PIDs nach Prozessnamen in Python zu bekommen”

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

 import psutil PROCNAME = "python.exe" for proc in psutil.process_iter(): if proc.name() == PROCNAME: print(proc) 

Auf meiner Maschine druckt es:

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

EDIT 2017-04-27 – hier ist eine erweiterte Utility-Funktion, die den Namen auf den Namen 'name (), cmdline () und exe () überprüft:

 import os import psutil def find_procs_by_name(name): "Return a list of processes matching 'name'." assert name, name ls = [] for p in psutil.process_iter(): name_, exe, cmdline = "", "", [] try: name_ = p.name() cmdline = p.cmdline() exe = p.exe() except (psutil.AccessDenied, psutil.ZombieProcess): pass except psutil.NoSuchProcess: continue if name == name_ or cmdline[0] == name or os.path.basename(exe) == name: ls.append(name) return ls 

Es gibt keine einzige Cross-Plattform-API, müssen Sie für OS zu überprüfen. Für posix basierte Nutzung / Proc. Für Windows verwenden Sie den folgenden Code, um eine Liste aller pids mit korrespondierenden Prozessnamen zu erhalten

 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 können dann problemlos Prozesse herausfiltern, die Sie benötigen. Für weitere Informationen über verfügbare Eigenschaften von Win32_Process check out Win32_Process Class

 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"

Ich glaube nicht, dass Sie in der Lage sein werden, eine rein pythonbasierte, tragbare Lösung zu finden, ohne dass Sie / proc oder Kommandozeilenprogramme verwenden, zumindest nicht in Python selbst. Parsing os.system ist nicht hässlich – jemand muss mit den mehreren Plattformen umgehen, sei es Sie oder jemand anderes. Die Umsetzung für das Betriebssystem, das Sie interessiert sind, sollte ziemlich einfach, ehrlich sein.

Zuerst ist Windows (in allem ist es Inkarnationen) ein Nicht-Standard-Betriebssystem.

Linux (und proprietäre unixen) sind POSIX-konforme Standard-Betriebssysteme.

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

Es gibt keinen "Cross-Plattform" Weg, dies zu tun. Du musst etwas mit Ctypes für eine bestimmte Version von Windows (XP oder Vista) hacken

Es gibt keine, ich habe Angst. Prozesse sind eindeutig identifiziert mit pid nicht nach Namen. Wenn du wirklich einen pid mit Namen finden musst, dann wirst du etwas so haben, wie du vorgeschlagen hast, aber es wird nicht tragbar sein und wird wahrscheinlich nicht in allen Fällen arbeiten.

Wenn du nur die pids für eine bestimmte Anwendung finden musst und du die Kontrolle über diese Anwendung hast, dann würde ich vorschlagen, diese App zu ändern, um ihre pid in Dateien an einem Ort zu speichern, wo dein Skript es finden kann.

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

Von java.lang.management import *
Pid = ManagementFactory.getRuntimeMXBean () getName ()

Eine Anmerkung zu ThorSummoners Kommentar

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

Ich habe es auf Debian mit Python 3 ausprobiert, ich denke, es muss proc.name() statt proc.name .

  • Python-Module in jython importieren
  • Log4j mit Zeitstempel pro Log-Eintrag
  • Verwenden einer Java-Bibliothek von Python
  • Jython- und Python-Module
  • Was sind einige Strategien zu schreiben Python-Code, der in CPython, Jython und IronPython funktioniert
  • Wie kann ich Scikit-Learn-Klassifikatoren von Java anrufen?
  • Python UDF Version mit Jython / Pig
  • Was ist der Unterschied zwischen "is None" und "== None"
  • Python aus Java verwenden
  • Wie man Argumente an Python-Skript in Java mit Jython übergeben
  • Wie benutzt man native Cpython-Erweiterungen in Jython
  • Python ist die beste Programmiersprache der Welt.