Seite 1 von 1

Ausgabe eines mit os.system ausgeführten Befehls auslesen

Verfasst: Dienstag 15. Mai 2007, 23:48
von el3ktro
Hi, ich möchte die Ausgabe eines Befehls, den ich mit os.system() ausführe, in eine Variable speichern. Der Befehl sieht folgendermaßen aus:

os.system("ssh server dpkg -l")

Ich will mir also die installierten Pakete auf einem entfernten System ausgeben lassen und diese Liste in einer Variablen ablegen. os.system selbst gibt nur den Returnwert der aufgerufenen Shell zurück, aber nicht die eigentliche Bildschirmausgabe. Gibts da eine Möglichkeit?

Tom

Verfasst: Dienstag 15. Mai 2007, 23:55
von BlackJack
Schau mal ins `subprocess`-Modul.

Verfasst: Mittwoch 16. Mai 2007, 00:44
von el3ktro
Perfekt, genau was ich gesucht hab!

Code: Alles auswählen

cmd = "ssh server dpkg -l"
proc = subprocess.Popen(cmd, shell='true', stdout=subprocess.PIPE)
print proc.stdout.read()
Danke!

Verfasst: Mittwoch 16. Mai 2007, 00:53
von el3ktro
Hm, mein Probem ist jetzt nur das mir dpkg -l gar nichts bringt, da es die Paketnamen bei der Auflistung ab einer gewissen Länge abschneidet. Aber das gehört nicht in dieses Forum ...

EDIT: ok, dpkg --get-selection heißt die Lösung ;-)

Verfasst: Dienstag 29. Januar 2008, 15:24
von simpson-fan
Hallo!

Ich habe nach den oberen 3 Codezeilen auch eine Aufgabe meines Projektes erfolgreich beenden können. Wenn ich das Programm jetzt jedoch beende, dann erhalte ich folgende Meldung.

Code: Alles auswählen

Exception exceptions.AttributeError: "'NoneType' object has no attribute 'error'" in <bound method Popen.__del__ of <subprocess.Popen object at 0xb7ce888c>> ignored
Weiß jemand vielleicht was mir der sagen will?

Gruß simpson-fan

Verfasst: Dienstag 29. Januar 2008, 15:53
von Frank aka Ch3ck3r
beendest du dein programm bevor der mit subprocess gestartete Prozess fertig ist?

Verfasst: Dienstag 29. Januar 2008, 16:12
von simpson-fan
Hallo und danke erstmal für deine Antwort. Ich benötige subprocess eigentlich nur für diese eine Sache und zwar für die Ausgabe von xdpyinfo, hier das Codebeispiel.

Code: Alles auswählen

cmd = "xdpyinfo|grep dimensions"
proc = subprocess.Popen(cmd, shell='true', stdout=subprocess.PIPE)
autoaufloesung = proc.stdout.read()
Das Programm läuft noch ein weilchen weiter, aber subprocess brauch ich nicht mehr. Muss ich das irgendwie außergewöhnlich beenden?

Gruß simpson-fan

Verfasst: Dienstag 29. Januar 2008, 18:01
von BlackJack
Ja und nein. Man sollte mit der `wait()`-Methode den Rückgabestatus abrufen. Ich weiss nicht ob man sonst nicht für den Rest des Programms den ``xdpyinfo``-Prozess als Zombie herum hängen lässt. Das sollte aber eigentlich nicht zu der Ausnahme führen. Die allerdings auch nur dann auftaucht, wenn die `Popen`-Instanz am Programmende noch existiert, was sie wohl nicht müsste.

Ausserdem würde ich nur `xdpyinfo` starten, und das dann auch nicht über den Umweg über eine Shell, und die entsprechende Zeile selbst auslesen.

Verfasst: Dienstag 29. Januar 2008, 18:13
von simpson-fan
Also wenn du eine bessere Methode kennst. Eigentlich will ich damit nur die Auflösung auslesen. Mit der jetzigen Methoder funktioniert das sehr gut, ich bekomm halt beim beenden des Programms immer diese Fehlermeldung.

Gruß simpson-fan

Verfasst: Mittwoch 30. Januar 2008, 14:43
von simpson-fan
Hallo!

Ich schieb das Thema mal nach oben. Ist es wirklich nicht möglich diese hässliche Fehlermeldung zum Schluss des Programmes zu verhindern?

Gruß simpson-fan