Seite 1 von 1

Probleme mit Popen

Verfasst: Donnerstag 11. März 2010, 20:40
von fl0
Hallo zusammen,

ich habe ein paar Schwierigkeiten mit Popen... folgendes möchte ich tun:

Ich möchte den Befehl /usr/sbin/fping -c5 8.8.8.8 ausführen, was mir auf der Shell folgendes liefert:

Code: Alles auswählen

/usr/sbin/fping -C5 8.8.8.8
8.8.8.8 : [0], 96 bytes, 5.25 ms (5.25 avg, 0% loss)
8.8.8.8 : [1], 96 bytes, 4.39 ms (4.82 avg, 0% loss)
8.8.8.8 : [2], 96 bytes, 3.52 ms (4.38 avg, 0% loss)
8.8.8.8 : [3], 96 bytes, 2.95 ms (4.02 avg, 0% loss)
8.8.8.8 : [4], 96 bytes, 5.40 ms (4.30 avg, 0% loss)

8.8.8.8 : 5.25 4.39 3.52 2.95 5.40

Folgendes hab ich in python gemacht:

Code: Alles auswählen

#!/usr/bin/env python


import subprocess

output = subprocess.Popen(["/usr/sbin/fping", "-c8" ,"8.8.8.8"] , stdout=subprocess.PIPE).communicate()[0]
print "-------Hier beginnt die Scriptausgabe--------"
print output

Code: Alles auswählen

Die Ausgabe ist folgende:

python check_latency.py 

8.8.8.8 : xmt/rcv/%loss = 8/8/0%, min/avg/max = 3.00/5.84/9.51
-------Hier beginnt die Scriptausgabe--------
8.8.8.8 : [0], 96 bytes, 5.43 ms (5.43 avg, 0% loss)
8.8.8.8 : [1], 96 bytes, 4.08 ms (4.75 avg, 0% loss)
8.8.8.8 : [2], 96 bytes, 7.43 ms (5.64 avg, 0% loss)
8.8.8.8 : [3], 96 bytes, 3.53 ms (5.11 avg, 0% loss)
8.8.8.8 : [4], 96 bytes, 7.03 ms (5.50 avg, 0% loss)
8.8.8.8 : [5], 96 bytes, 9.51 ms (6.16 avg, 0% loss)
8.8.8.8 : [6], 96 bytes, 6.76 ms (6.25 avg, 0% loss)
8.8.8.8 : [7], 96 bytes, 3.00 ms (5.84 avg, 0% loss)
Das was ich eigentlich möchte ist diese Ausgabe:

Code: Alles auswählen

8.8.8.8 : xmt/rcv/%loss = 8/8/0%, min/avg/max = 3.00/5.84/9.51
die komischerweise auf stdout ausgegeben wird.....


Ich verstehe nicht ganz warum, da ich doch stdout auf PIPE gesetzt habe....

mfg fl0

Re: Probleme mit Popen

Verfasst: Donnerstag 11. März 2010, 20:51
von ms4py
fl0 hat geschrieben: Das was ich eigentlich möchte ist diese Ausgabe:

Code: Alles auswählen

8.8.8.8 : xmt/rcv/%loss = 8/8/0%, min/avg/max = 3.00/5.84/9.51
die komischerweise auf stdout ausgegeben wird.....
Sicher, dass das nicht in stderr steht? (Setze es testweise einfach auch auf PIPE).

Verfasst: Donnerstag 11. März 2010, 21:01
von fl0
Ok das hab ich jetzt mal geändert, jetzt kommt die Ausgabe auch auf stdout nicht mehr...

Code: Alles auswählen

#!/usr/bin/env python

import subprocess

output = subprocess.Popen(["/usr/sbin/fping", "-c8" ,"8.8.8.8"] , stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()[0]
print "-------Hier beginnt die Scriptausgabe--------"
print output

Code: Alles auswählen

python check_latency.py 
-------Hier beginnt die Scriptausgabe--------
8.8.8.8 : [0], 96 bytes, 5.61 ms (5.61 avg, 0% loss)
8.8.8.8 : [1], 96 bytes, 4.69 ms (5.15 avg, 0% loss)
8.8.8.8 : [2], 96 bytes, 3.23 ms (4.51 avg, 0% loss)
8.8.8.8 : [3], 96 bytes, 3.50 ms (4.25 avg, 0% loss)
8.8.8.8 : [4], 96 bytes, 3.18 ms (4.04 avg, 0% loss)
8.8.8.8 : [5], 96 bytes, 3.45 ms (3.94 avg, 0% loss)
8.8.8.8 : [6], 96 bytes, 3.21 ms (3.83 avg, 0% loss)
8.8.8.8 : [7], 96 bytes, 4.11 ms (3.87 avg, 0% loss)

Verfasst: Donnerstag 11. März 2010, 21:17
von fl0
Habs gefunden, die Idee von dir war Richtig, nur das ich jetzt STDERR auf STDOUT geleitet habe... anstatt mit PIPE

Code: Alles auswählen

#!/usr/bin/env python

import subprocess

output = subprocess.Popen(["/usr/sbin/fping", "-c8" ,"8.8.8.8"] , stdout=subprocess.PIPE, stderr=subprocess.STDOUT).communicate()[0]
print "-------Hier beginnt die Scriptausgabe--------"
print output
print "-------Hier endet die Scriptausgabe--------"

Code: Alles auswählen

python check_latency.py 
-------Hier beginnt die Scriptausgabe--------
8.8.8.8 : [0], 96 bytes, 8.28 ms (8.28 avg, 0% loss)
8.8.8.8 : [1], 96 bytes, 3.08 ms (5.68 avg, 0% loss)
8.8.8.8 : [2], 96 bytes, 3.99 ms (5.11 avg, 0% loss)
8.8.8.8 : [3], 96 bytes, 2.90 ms (4.56 avg, 0% loss)
8.8.8.8 : [4], 96 bytes, 3.81 ms (4.41 avg, 0% loss)
8.8.8.8 : [5], 96 bytes, 3.71 ms (4.29 avg, 0% loss)
8.8.8.8 : [6], 96 bytes, 3.65 ms (4.20 avg, 0% loss)
8.8.8.8 : [7], 96 bytes, 3.07 ms (4.06 avg, 0% loss)

8.8.8.8 : xmt/rcv/%loss = 8/8/0%, min/avg/max = 2.90/4.06/8.28

-------Hier endet die Scriptausgabe--------
Danke für den Tipp!!

Verfasst: Donnerstag 11. März 2010, 21:40
von lunar
Wenn Du nur an dieser Zeile interessiert bist, reicht es doch, einfach nur stderr umzuleiten:

Code: Alles auswählen

output = subprocess.Popen(["/usr/sbin/fping", "-c8" ,"8.8.8.8"], stderr=subprocess.PIPE).communicate()[1]

Verfasst: Donnerstag 11. März 2010, 21:47
von fl0
Hallo,

Code: Alles auswählen

#!/usr/bin/env python

import subprocess

output = subprocess.Popen(["/usr/sbin/fping", "-c8" ,"8.8.8.8"] , stderr=subprocess.PIPE).communicate()[1]
print "-------Hier beginnt die Scriptausgabe--------"
print output
print "-------Hier endet die Scriptausgabe--------"
python check_latency.py
8.8.8.8 : [0], 96 bytes, 4.58 ms (4.58 avg, 0% loss)
8.8.8.8 : [1], 96 bytes, 2.86 ms (3.72 avg, 0% loss)
8.8.8.8 : [2], 96 bytes, 3.45 ms (3.63 avg, 0% loss)
8.8.8.8 : [3], 96 bytes, 4.37 ms (3.81 avg, 0% loss)
8.8.8.8 : [4], 96 bytes, 3.18 ms (3.68 avg, 0% loss)
8.8.8.8 : [5], 96 bytes, 3.66 ms (3.68 avg, 0% loss)
8.8.8.8 : [6], 96 bytes, 3.32 ms (3.63 avg, 0% loss)
8.8.8.8 : [7], 96 bytes, 3.32 ms (3.59 avg, 0% loss)
-------Hier beginnt die Scriptausgabe--------

8.8.8.8 : xmt/rcv/%loss = 8/8/0%, min/avg/max = 2.86/3.59/4.58

-------Hier endet die Scriptausgabe--------

ja da hast du recht Danke, funktioniert auch (verstehe zwar nicht was die Ausgabe auf STDERR zu suchen hat aber ok ...) .... nun hab ich aber nen anderes Probelm....

In output stehen alle Zeichen einzeln drin (sind 45 Einträge insgesamt), ich hätte da eine zusamenhängende Zeichenkette erwartet...

Verfasst: Freitag 12. März 2010, 07:45
von snafu
fl0 hat geschrieben:In output stehen alle Zeichen einzeln drin (sind 45 Einträge insgesamt), ich hätte da eine zusamenhängende Zeichenkette erwartet...
Normalerweise ist die Ausgabe auch eine einzelne Zeichenkette. Verstehe ich es richtig, dass du stattdessen eine Liste von einzelnen Zeichen kriegst? Zeig das mal bitte im Detail.

Verfasst: Freitag 12. März 2010, 09:04
von BlackJack
@fl0: Da stimmt Deine Problembeschreibung aber nicht mit der gezeigten Ausgabe überein. Zwischen den beiden Markierungen für die Skriptausgabe wird eine zusammenhängende Zeichenkette ausgegeben. Wenn das eine Liste mit den Einzelbuchstaben wäre, würde die Ausgabe anders aussehen.

Verfasst: Freitag 12. März 2010, 10:48
von fl0
Hallo,

war mein Fehler..... ich hatte output mit einer for Schleife ausgegeben, und da hab ich dann jedes Zeichen einzeln bekommen, gebe ich output komplett aus, dann habe ich eine zusammenhängende Zeichenkette.

Bleibt nur noch die Frage warum das auf STDERR steht.

Verfasst: Freitag 12. März 2010, 13:29
von lunar
Diese Frage musst Du an den Entwickler von fping stellen.