Seite 1 von 1

2 Probleme: "Systeminformationen direkt abrufen" u

Verfasst: Mittwoch 3. August 2005, 14:56
von pSy
Hallo allerseits...

ich habe da zwei Probleme:
einerseits würde ich gerne wissen ob man folgende Systeminformationen unter Python betriebssystemtransparent (also unter BSD, Linux und evtl Windows) gleichermaßen abrufen kann:
  • CPU Load
    CPU Nice Load
    RAM/SWAP Load
    IO Load (Zugriffe auf HDDs)
    Network Traffic
anderseits hatte ich gern gewusst, wie ich ein externes Programm verwenden kann, welches nicht terminiert. Das heißt, ich starte das Programm von außen und möchte direkt über stdout/stdin mit ihm kommunizieren ohne das Programm zwischendurch beenden zu müssen.

MfG
der Norman

Re: 2 Probleme: "Systeminformationen direkt abrufen&quo

Verfasst: Mittwoch 3. August 2005, 18:12
von ProgChild
pSy hat geschrieben:einerseits würde ich gerne wissen ob man folgende Systeminformationen unter Python betriebssystemtransparent (also unter BSD, Linux und evtl Windows) gleichermaßen abrufen kann:
  • CPU Load
    CPU Nice Load
    RAM/SWAP Load
    IO Load (Zugriffe auf HDDs)
    Network Traffic
Schau dir malPyStatGrab an. Ich weis leider nicht, ob das auch auf Windows läuft...
pSy hat geschrieben:anderseits hatte ich gern gewusst, wie ich ein externes Programm verwenden kann, welches nicht terminiert. Das heißt, ich starte das Programm von außen und möchte direkt über stdout/stdin mit ihm kommunizieren ohne das Programm zwischendurch beenden zu müssen.
Das sollte mit Pipes gehen...

Verfasst: Donnerstag 4. August 2005, 14:22
von Gast
Danke erstmal für die Antwort und PyStatGrab :)
...
Das sollte mit Pipes gehen...
Naja, ich hab das glaube etwas unglücklich formuliert. Das Programm wird schon vom Script aus gestartet und das selbe Script soll dann auf die genannte Weise damit kommunizieren.
So wie zB folgendes:

Code: Alles auswählen

from subprocess import Popen, PIPE
p=Popen([prog,args], stdout=PIPE, stdin=PIPE)
commands = [cmd1, cmd2, cmd3]
out = list()
for cmd in commands:
  p.stdin.write(cmd)
  out.append(p.stdout.readlines())
return out
Problem bei diesem Progrämmchen wäre, die Exception "Broken Pipe", nach dem ersten ausführen. Wie kann ich das umgehen? Ich möchte nämlich in meinem Programm eine Funktion ausführen, die das Programm dann für mich anspricht. Aber wenn ich in 7 oder 8 Sekunden bereits 100 Programmaufrufe habe wäre es doch viel schöner das Programm einmal zu starten und ihm dann die Befehle zu übergeben (das Programm unterstützt diese Funktion).

MfG

Verfasst: Donnerstag 4. August 2005, 14:39
von ProgChild
Ich hab dein Programm mal nach Python 2.3 umgeschrieben und ein wenig verändert.

Code: Alles auswählen

from os import popen2

prog = "bash"
args = []

(child_in, child_out) = popen2( prog )

commands = [ 'cd /home', 'ls', 'echo Hallo', 'exit']

out = []
for cmd in commands:
	child_in.write( cmd + "\n" )
	child_in.flush()

out.append( child_out.readlines() )

print out 
So klappt es bei mir. Ich kann mir vorstellen, dass sich dein Programm beendet, und du das nicht mitbekommst. Ein Problem, bei dem Programm ist außerdem, dass du stderr nicht überprüfst...

Verfasst: Donnerstag 4. August 2005, 16:04
von Gast
danke dafür... klappte bei mir im ersten versuch allerdings nicht. ich habe das kleine script nur schnell zusammen getippselt um mein problem zu veranschaulichen. mein programm ist viel zu groß und komplex um das "auf die schnelle" hier zu zeigen :-S

danke trotzdem dafür... ich werd sehen ob ich was damit anfangen kann.

MfG pSy