Seite 1 von 1

pid2data.py - An PID Name auslesen

Verfasst: Freitag 7. März 2008, 15:59
von BasterTWO
Hallo,
da ich oft hier schon gelesen habe wie man den Namen eines Prozesses nur an der PID auslesen kann habe ich mal eine kleine Funktion geschrieben.

pid2data.py

Code: Alles auswählen

#!/usr/bin/python2.5
# -*- coding: utf-8 -*-
import os
import sys

def pid2data(pid):
    """\
    Diese Funktion kann Daten von Prozessen ausgeben nur mit der PID
    """
    statusfile = "/proc/" + pid + "/status"
    if os.path.exists(statusfile) == "False":
        return False
    statusfile = file(statusfile, 'rU')
    data = {}
    for line in statusfile:
        line_lower = line.lower()
        if line_lower.startswith("name:"):
            data["name"] = line[len("Name:"):].strip()
        elif line_lower.startswith("pid:"):
            data["pid"] = line[len("pid:"):].strip()
    statusfile.close()
    return data

def main():
    pid = 1234    # Hier muss natürlich die richtige PID
    data = pid2data(pid)
    print data['name']
    print data['pid']

if __name__ == '__main__':
    main()
Ich hoffe die paar Zeilen können jemanden Helfen.

Viele Grüße
BasterTWO

Verfasst: Freitag 7. März 2008, 16:12
von EyDu
Anstelle von

Code: Alles auswählen

statusfile = "/proc/" + pid + "/status"
solltest du die Funktion "os.path.join" verwenden.

Die Zeile

Code: Alles auswählen

if os.path.exists(statusfile) == "False":
geht ja mal gar nicht ;-) Du meinst statt dem String "False" sicherlich nur False. Noch einfacher geht es mit "not":

Code: Alles auswählen

if not os.path.exists(statusfile):
Außerdem ist False als Rückgabewert etwas schlecht gewählt. An dieser Stelle würde sich eine Exception anbieten, oder None.

Eine Datei öffnent man typischerweise nicht mit "file" sondern mit "open". Außerdem könnte beim Öffnen eine IO-Exception geworfen werden. Wenn du diese abfängst, kannst du auch das Testen, ob die die Datei existiert, überspringen

Für "name" und "pid" könnte man ebenfalls noch Konstanten einführen. Damit könnte man dann auch das if/elif-Konstrukt vereinfachen.

Edit: Das

Code: Alles auswählen

"/proc/" + pid
wird natürlich nicht funktionieren, da "pid" ein Integer ist.