【问题标题】:Why is my output one character per line?为什么我的输出每行一个字符?
【发布时间】:2017-03-17 04:31:32
【问题描述】:

我有这个 python 脚本,它调用一个 shell 脚本并处理输出。

$ 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

?

【问题讨论】:

  • for line in proc.communicate()[0] 不会遍历行。 proc.communicate()[0] 是一个字符串。遍历字符串会遍历字符。
  • 噢!谢谢!我什至没有看到那里的 [0]。
  • 删除 [0] 不会让它遍历行。
  • 你的权利,我将如何迭代行?

标签: python


【解决方案1】:

尝试改变这个:

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

【讨论】:

    猜你喜欢
    • 2022-11-18
    • 1970-01-01
    • 1970-01-01
    • 2013-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-25
    • 1970-01-01
    相关资源
    最近更新 更多