2014-01-29 63 views
7

我無法按行讀取我的子過程輸出。子進程只是簡單地將文件的內容映射到另一個文件。輸出應該是一個兩列文件,輸出到stdout就好了。但是,當我嘗試讀取每一行,它讀取每個CHAR其次是\ N:Python:subprocess.popen:讀取輸出的每一行

#!/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??? 

預計輸出逐行讀取後:

abc 123 
def 456 
ghi 789 

^^這將打印,如果我只是「打印輸出「

使用循環讀取每個行,當實際輸出:

a 
b 
c 

1 
2 
3 

d 
e 
f 

...

任何想法?謝謝。

回答

7

嘗試以下操作:

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

代替:

for line in output: 
+0

這樣做。謝謝!很快就會接受。 – corneria

7

for c in s:在同一時間從一個字符串s讀取一個字符(如它應該)。從字符串獲取行的列表,而不是,您可以使用.splitlines() method

lines = output.splitlines() 

你不需要調用.communicate()由線讀取輸出線:

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

您可以修改代碼以不同方式處理buffering或啓用universal newlines support

+1

感謝您的提示。從我的腳本中刪除約5行代碼。 – corneria

相關問題