ubuntuusers.de

Python os.popen Verarbeitung

Status: Gelöst | Ubuntu-Version: Kein Ubuntu
Antworten |

ak01

Anmeldungsdatum:
15. Januar 2007

Beiträge: 89

Hallo!

Ich bin noch recht neu mit Python(3), und möchte mir mittels popen die Ausgabe von einem aufgerufenen Befehl verarbeiten. Als Beispiel mit dem Befehl ping:

import os
output = os.popen("ping -c 1 www.google.de").readlines()
print (output)

Das Ergebnis wird in output korrekt abgespeichert und ausgegeben. Jedoch klappt das mit anderen Programmen leider nicht, hier z.B. mit wget:

import os
output = os.popen("wget www.google.de").readlines()
print (output)

Hier wird komischerweise der normale Output direkt ausgegeben, egal ob ich die print-Anweisung einfüge oder nicht. Jedoch wird der Output nicht in der Variablen output gespeichert. Woran liegt das und wie kann ich den gesammten Output verarbeiten?

redknight Team-Icon

Moderator & Supporter
Avatar von redknight

Anmeldungsdatum:
30. Oktober 2008

Beiträge: 21837

Wohnort: Lorchhausen im schönen Rheingau

Ich glaube - weiß es aber nciht sicher - dass in output in deinem Fall der Returncode steht. Die Ausgabe von ping erfolgt jedenfalls auf stderr und nicht auf stdout

John_W

Anmeldungsdatum:
10. Juli 2010

Beiträge: 571

Ginge z.B. so:

output = os.popen("wget www.google.de 2>&1").readlines()

Allerdings wäre es besser, auf das subprocess-Modul umzusteigen.

Fredo Team-Icon

Avatar von Fredo

Anmeldungsdatum:
27. Juni 2005

Beiträge: 5244

Wohnort: Bochum

Ja, sieh Dir auf jeden Fall mal subprocess und die stdout- und stderr-Parameter an. Neuerdings (Python 2.7) gibt es offenbar sogar eine Funktion check_output, die ziemlich genau das machen sollte, was Du willst. Aber auch mit subprocess.Popen ist es ziemlich leicht, an die Ausgabe eines Programms zu kommen. In der Doku gibt es gute Beispiele, die alle diese Fälle abdecken.

Liebe Grüße
Fredo

noisefloor Team-Icon

Anmeldungsdatum:
6. Juni 2006

Beiträge: 29567

Hallo,

im deutschen Python-Forum wird immer aktiv von popen abgeraten und zu subprocess geraten. Fredo hat's ja schon erwähnt.

Gruß, noisefloor

ak01

(Themenstarter)

Anmeldungsdatum:
15. Januar 2007

Beiträge: 89

Hi! Danke für die Antworten! Ich habe es jetzt mit subprocess hinbekommen:

from subprocess import Popen, PIPE, STDOUT

output = Popen("wget www.google.de", shell=True, stdin=PIPE, stdout=PIPE, stderr=STDOUT, close_fds=True).stdout.read()
print (str(output))

Hello_World

Anmeldungsdatum:
13. Juni 2006

Beiträge: 3620

Es ist zu empfehlen, stets shell=False zu verwenden.

Antworten |