python循环遍历subprocess.check_output

bah*_*mat 7 subprocess python-2.7

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

这是一个文件:

foo
bar
Run Code Online (Sandbox Code Playgroud)

这是我的python脚本:

import subprocess

for line in subprocess.check_output(['cat', 'foo']):
  print "%r" % line
Run Code Online (Sandbox Code Playgroud)

而这就是我得到的:

$ python subp.py 
'f'
'o'
'o'
'\n'
'b'
'a'
'r'
'\n'
Run Code Online (Sandbox Code Playgroud)

我预计:

$ python subp.py
'foo\n'
'bar\n'
Run Code Online (Sandbox Code Playgroud)

nic*_*anc 13

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

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

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

import subprocess

print subprocess.check_output(['cat', 'foo'])
Run Code Online (Sandbox Code Playgroud)

你也可以这样做:

import subprocess

for line in subprocess.check_output(['cat', 'foo']).split('\n'):
    print "%r" % line
Run Code Online (Sandbox Code Playgroud)

  • 也可以使用 [`.splitlines()`](https://docs.python.org/library/stdtypes.html#str.splitlines) 或 `p = `[`subprocess.Popen`](https://docs .python.org/library/subprocess.html#popen-constructor)`(..., stdout=subprocess.PIPE);对于p.stdout中的行:...` (3认同)

Ale*_*llo 7

使用 Python3 之前的答案不能立即生效,因为bytes由返回check_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)

Run Code Online (Sandbox Code Playgroud)