2017-03-17 5 views
0

私はシェルスクリプトを呼び出して出力を処理するこのpythonスクリプトを持っています。ここで出力が1行につき1文字になるのはなぜですか?

$ 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:]) 

上記のスクリプトを呼び出すシェルスクリプトです:

$ 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 

?私はあなたが意図せずに文字列を反復処理していると思います

print proc.communicate()[0] 

:これまで

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

+0

'ラインのproc.communicateで()[0]'行を反復しません。 'proc.communicate()[0]'は文字列です。文字列を反復処理すると、文字を繰り返し処理します。 – user2357112

+0

Doh!ありがとう!私はそこに[0]が見えなかった。 –

+0

'[0]'を削除しても、行間を反復させることはありません。 – user2357112

答えて

3

はこれを変更してみてください。

EDIT:this questionで述べたように

、あなたが標準出力の複数行のためproc.communicate()[0].splitlines()を反復処理することができます。おそらくそれを行うにはきれいな方法はsame questionに説明した本、のようなものです:

for line in proc.stdout: 
    print line 
関連する問題