Python: sous-processus.popen: lire chaque ligne de sortie
Je vais avoir de la difficulté à la lecture de mon sous-processus de sortie par ligne. Le sous-processus simplement grep le contenu d'un fichier par rapport à un autre fichier. La sortie, qui devrait être l'un des deux fichiers en colonne, imprime sur la sortie standard l'amende juste. Mais lorsque je tente de lire chaque ligne, il lit chaque char suivi par \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???
Sortie attendue après la lecture en ligne:
abc 123
def 456
ghi 789
^^ ce sera imprimée si j'ai juste "imprimer"
De sortie réelle lors de l'utilisation de la boucle pour lire chaque ligne:
a
b
c
1
2
3
d
e
f
...
Des idées? Merci.
OriginalL'auteur corneria | 2014-01-29
Vous devez vous connecter pour publier un commentaire.
Essayez ce qui suit :
au lieu de:
OriginalL'auteur jgritty
for c in s:
lit un caractère à la fois à partir d'une chaînes
(comme il se doit). Pour obtenir une liste de lignes à partir d'une chaîne au lieu de cela, vous pouvez utiliser.splitlines()
méthode:Vous n'avez pas besoin d'appeler
.communicate()
pour lire la sortie ligne par ligne:Vous pouvez modifier le code pour gérer mise en mémoire tampon différemment ou pour permettre universelle des retours à la ligne de support.
OriginalL'auteur jfs