Ausgabe eines mit os.system ausgeführten Befehls auslesen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
el3ktro
User
Beiträge: 13
Registriert: Dienstag 15. Mai 2007, 23:38

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
BlackJack

Schau mal ins `subprocess`-Modul.
el3ktro
User
Beiträge: 13
Registriert: Dienstag 15. Mai 2007, 23:38

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!
el3ktro
User
Beiträge: 13
Registriert: Dienstag 15. Mai 2007, 23:38

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 ;-)
simpson-fan
User
Beiträge: 5
Registriert: Dienstag 29. Januar 2008, 15:21

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
Frank aka Ch3ck3r
User
Beiträge: 49
Registriert: Dienstag 13. November 2007, 21:56
Wohnort: Berlin
Kontaktdaten:

beendest du dein programm bevor der mit subprocess gestartete Prozess fertig ist?
kostenlose TS2-Server für jeweils 31 Tage:
http://www.ts-onlyfree.de
simpson-fan
User
Beiträge: 5
Registriert: Dienstag 29. Januar 2008, 15:21

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
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.
simpson-fan
User
Beiträge: 5
Registriert: Dienstag 29. Januar 2008, 15:21

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
simpson-fan
User
Beiträge: 5
Registriert: Dienstag 29. Januar 2008, 15:21

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
Antworten