【问题标题】:python loop over subprocess.check_output by linepython 逐行循环 subprocess.check_output
【发布时间】:2013-08-17 03:14:32
【问题描述】:

我需要遍历命令的输出。我以为我会使用subprocess.check_output,现在我有两个问题。

这是一个文件:

foo
bar

这是我的 python 脚本:

import subprocess

for line in subprocess.check_output(['cat', 'foo']):
  print "%r" % line

这就是我得到的:

$ python subp.py 
'f'
'o'
'o'
'\n'
'b'
'a'
'r'
'\n'

我希望:

$ python subp.py
'foo\n'
'bar\n'

【问题讨论】:

    标签: python-2.7 subprocess


    【解决方案1】:

    subprocess.check_output(['cat', 'foo']) 返回一个字符串:"foo\nbar"

    因此,您的 for 循环遍历字符串,逐个打印每个字符。

    以下应该可以解决您的问题:

    import subprocess
    
    print subprocess.check_output(['cat', 'foo'])
    

    你也可以这样做:

    import subprocess
    
    for line in subprocess.check_output(['cat', 'foo']).split('\n'):
        print "%r" % line
    

    【讨论】:

    【解决方案2】:

    使用 Python3 之前的答案不会立即起作用,因为 bytescheck_output 返回

    然后您可以将字节解码为字符串或立即将它们拆分:

    output = subprocess.check_output(['cat', 'foo'])
    
    # splitting with byte-string
    for line in output.split(b'\n'): 
        print(line)
    
    # or decoding output to usual string
    output_str = output.decode()
    for line in output_str.split('\n'):
        print(line)
    
    

    【讨论】:

    • 如果要处理文本(典型用法),添加text=True(或者,如果文本不是UTF-8,则添加encoding=whatever)是更好的解决方案。
    【解决方案3】:

    Python3:

    for line in subprocess.check_output(['cat', 'foo'], universal_newlines=True).split('\n'):
        print(line)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-20
      • 2018-11-29
      • 1970-01-01
      • 2019-04-18
      • 2012-09-24
      • 1970-01-01
      • 1970-01-01
      • 2015-09-08
      相关资源
      最近更新 更多