2014-01-29 12 views
7

Ich habe Probleme beim Lesen meiner Subprozess-Ausgabe von Zeile. Der Unterprozess greppt einfach den Inhalt einer Datei gegen eine andere Datei. Die Ausgabe, bei der es sich um eine zweispaltige Datei handeln sollte, wird in stdout gedruckt. Aber wenn ich versuche, jede Zeile zu lesen, liest sie jeweils von \ gefolgt char n:Python: subprocess.popen: Lesen Sie jede Zeile der Ausgabe

#!/usr/bin/python  

import sys 
import getopt 
import os 
import subprocess 
from subprocess import Popen, PIPE, STDOUT 

inputfile = '' 
target = '' 

try: 
     opts, args = getopt.getopt(sys.argv[1:],"s:t:",['servers=', 'target=']) 
except getopt.GetoptError: 
     print 'getopt failure: exit' 
     sys.exit() 

for opt, arg in opts: 
     if opt in ("-s", "--servers"): 
       inputfile = arg 
     if opt in ("-t", "--target"): 
       boxwin = arg 

p1 = subprocess.Popen(["grep -f " + inputfile + " " + target + " | awk '{print $2, $1}'"], stdout=subprocess.PIPE, shell=True) 

output, error = p1.communicate() 

print output # this prints normally 

for line in output: 
     print line # this prints each char of output followed by \n??? 

Erwarteter Ausgabe nach Zeile zu lesen:

abc 123 
def 456 
ghi 789 

^^ das wird gedruckt, wenn ich nur „Druckausgabe "

Tatsächlicher Ausgang, wenn für jede Zeile Schleife zu lesen:

a 
b 
c 

1 
2 
3 

d 
e 
f 

...

Irgendwelche Ideen? Vielen Dank.

Antwort

7

Versuchen Sie Folgendes:

for line in output.split(os.linesep): 

statt:

for line in output: 
+0

Das hat es getan. Vielen Dank! Wird in Kürze angenommen. – corneria

7

for c in s: liest ein Zeichen in einer Zeit von einem String s (wie es sein sollte). Um eine Liste von Zeilen aus einem String stattdessen zu bekommen, könnten Sie .splitlines() method verwenden:

lines = output.splitlines() 

Sie brauchen nicht .communicate() zu rufen die Ausgabe Zeile für Zeile zu lesen:

p = subprocess.Popen(cmd, stdout=PIPE) 
for line in p.stdout: 
    # do something with a line 

Sie könnten die ändern Code, um buffering anders zu behandeln oder zu aktivieren universal newlines support.

+1

Danke für den Tipp. Schneiden Sie ungefähr 5 Codezeilen aus meinem Skript heraus. – corneria

Verwandte Themen