Python: Unterprozess.popen: Lesen Sie jede Zeile der Ausgabe
Ich habe Probleme beim Lesen meiner Teilprozess output per line. Der Teilprozess einfach greps den Inhalt einer Datei gegen eine andere Datei. Die Ausgabe, die sollte sein eine zweispaltige Datei, Drucke auf stdout ganz gut. Aber wenn ich versuche zu Lesen jeder Zeile, liest es jeder char, gefolgt von \n:
#!/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???
Erwartete Ausgabe nach dem Lesen von Zeile:
abc 123
def 456
ghi 789
^^ das wird gedruckt, wenn ich nur "print-Ausgabe"
Tatsächlichen Ausgabe, wenn mit for-Schleife zum Lesen jeder Zeile:
a
b
c
1
2
3
d
e
f
...
Irgendwelche Ideen? Danke.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen Sie Folgendes :
statt:
for c in s:
liest ein Zeichen aus einem strings
(wie es sollte). Um eine Liste von Zeilen aus einem string statt, Sie könnte verwenden.splitlines()
Methode:Brauchen Sie nicht zu rufen
.communicate()
zum Lesen der Ausgabe-Zeile für Zeile:Könnten Sie den code ändern zu handhaben Pufferung anders oder zu aktivieren universal-newlines-Unterstützung.