Hab hier noch eine kleine Änderung, die den
"posix" Zweig (Linux, BSD, MacOSX) betrifft:
Das Problem hierbei ist, das "/proc" nicht auf allen POSIX-Systemen
zur Verfügung steht, wie man etwa vermuten würde...
MacOSX hat das Verzeichnis nicht, das hat man entsprechend
von den BSD - Betriebssystemen übernommen, die es wohl
nur noch zur Abwärtskompatibilität haben, wenn überhaupt
(was wohl nicht garantiert ist, so genau kenne ich mich
jetzt mit den BSD-Derivaten nicht aus.)
Ich würde hier ganz einfach die Rückgabewerte des
Shell Befehls "ps a" auswerten.. Dieser liefert die Prozesse
aller Nutzer (Das ist die Option "a".. ja, tatsächlich ohne führenden
Bindestrich hier, das ist nämlich der "BSD-Style" und der geht
sowohl unter Linux als auch BSD/MacOSX).
EDIT: Die hinzugefügte Funktion do_command
ist nur dazu gedacht, um für die neueren Python
Versionen, die Ausführung der Shell-Kommandos
via "subprocess" zu ermöglichen, während die älteren
die alte "os.popen" Methode weiter benutzen...
(Ist also für diejenigen, die es ganz genau nehmen..

)
Code: Alles auswählen
def do_command(command):
"""
Führt ein Shell-Kommando aus, je nach Python-Version in
der "richtigen" Art und Weise.
:return: Liste mit den Zeilen der Ausgabe des Shell-Kommandos.
"""
try:
# Für Python ab 2.4
from subprocess import Popen, PIPE
p1 = Popen(command, stdout=PIPE, shell=True)
output = p1.communicate()[0]
lines = output.split("\n")
except ImportError:
# Ältere Python Versionen
p1 = os.popen(command, 'r')
lines = p1.readlines()
return lines
def get_current_pids():
"""
Liefert die aktuellen Prozess-IDs.
Funktioniert mit Windows 32-Bit Versionen (64-Bit nicht getestet,
sollte aber funktionieren), Linux, MacOSX.
Sollte auch mit diversen BSD-Varianten funktionieren, aber noch nicht
getestet.
:return: Liste mit den Prozess-IDs
"""
if sys.platform.startswith("win"):
# Windows
try:
import win32process
# pywin32 ist installiert --> EnumProcesses
return list(win32process.EnumProcesses())
except ImportError:
try:
import ctypes as ct
# ctypes ist installiert --> Probiere mit psapi.dll
psapi = ct.windll.psapi
arr = ct.c_long * 1024
process_ids = arr()
cb = ct.sizeof(process_ids)
bytes_returned = ct.c_ulong()
psapi.EnumProcesses(ct.byref(process_ids), cb,
ct.byref(bytes_returned))
return sorted(list(set(process_ids)))
except ImportError:
# pywin32 und ctypes sind nicht installiert --> tasklist.exe
# Läuft mit Windows XP und höher.
import csv
csvlines = []
current_pids = []
for line in do_command("tasklist.exe /fo csv /nh"):
line = line.strip()
if line:
csvlines.append(line)
for line in csv.reader(csvlines):
current_pids.append(int(line[1]))
if not current_pids:
raise NotImplementedError("tasklist.exe not found (>WinXP)")
return current_pids
else:
# Linux, Cygwin, BSD-Varianten, MacOSX
# Wir fragen hier nicht etwa das "/proc" Verzeichnis
# ab, was unter Linux gehen würde, aber nicht unter den
# BSD - Systemen (wie MacOSX), sondern wir lesen einfach
# die Ausgabe des Befehls "ps a" aus.
current_pids = []
command = 'ps a'
lines = do_command(command)
# Überspringe erste Zeile, die die Header-Zeile ist
for line in lines[1:]:
line = line.strip()
if line != "":
pid = line.strip().split(" ")[0]
try:
current_pids.append(int(pid))
except ValueError:
pass
return current_pids