python 逐行循环 subprocess.check_output
Posted
技术标签:
【中文标题】python 逐行循环 subprocess.check_output【英文标题】:python loop over subprocess.check_output by line 【发布时间】: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'
【问题讨论】:
【参考方案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
【讨论】:
也可以使用.splitlines()
或p =
subprocess.Popen
(..., stdout=subprocess.PIPE);for line in p.stdout: ...
【参考方案2】:
使用 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)
【讨论】:
如果要处理文本(典型用法),添加text=True
(或者,如果文本不是UTF-8,则添加encoding=whatever
)是更好的解决方案。【参考方案3】:
Python3:
for line in subprocess.check_output(['cat', 'foo'], universal_newlines=True).split('\n'):
print(line)
【讨论】:
以上是关于python 逐行循环 subprocess.check_output的主要内容,如果未能解决你的问题,请参考以下文章
Python & Bigquery:使用 for 循环在表中逐行查询和插入数据