为什么我的输出每行一个字符?

问题描述:

我有这个调用shell脚本并处理输出的python脚本。为什么我的输出每行一个字符?

$ cat cd-and-run.py 
#!/usr/bin/env python 

import sys, getopt 
import subprocess 

def run_mock_phantom (test_value): 
     aid = 'unknown' 
     proc = subprocess.Popen(['./mock-phanton.sh', test_value], stdout=subprocess.PIPE) 
     for line in proc.communicate()[0]: 
       print line 
     return aid 

def main(argv): 
     app_id = run_mock_phantom ('test-one-two') 
     print "app is %s" % (app_id) 


if __name__ == "__main__": 
    main(sys.argv[1:]) 

这里是shell脚本上面的脚本调用:

$ cat mock-phanton.sh 
#!/bin/sh 

appid=$1 

if [ -z $appid ] 
then 
     echo "oh man you didnt do it right ..." 
     exit 0 
fi 

echo "APP_ID=$appid" 

当我运行该脚本,我得到这样的输出:

$ ./cd-and-run.py 
A 
P 
P 
_ 
I 
D 
= 
t 
e 
s 
t 
- 
o 
n 
e 
- 
t 
w 
o 


app is unknown 

我不明白的是为什么每个字符输出在一个单独的行,而不仅仅是...

APP_ID=test-one-two 

+0

'用于proc.communicate线()[0]'不随线迭代。 'proc.communicate()[0]'是一个字符串。遍历字符串迭代字符。 – user2357112

+0

Doh!谢谢!我甚至没有看到那里的[0]。 –

+0

删除'[0]'不会使它遍历行。 – user2357112

尝试修改此:

for line in proc.communicate()[0]: 
     print line 

这样:

print proc.communicate()[0] 

我想你无意中遍历字符串。

编辑:

正如this question提到的,你可以遍历标准输出的多行过proc.communicate()[0].splitlines()。也许更清洁的方式做到这一点是这样的,在same question描述:

for line in proc.stdout: 
    print line