根据Python 3.5文档,subprocess.run()返回一个带有stdout成员的CompletedProcess对象,该成员包含"一个字节序列,如果使用universal_newlines = True调用run(),则返回一个字符串." 我只看到一个字节序列而不是字符串,我假设(希望)等同于文本行.例如,
import pprint import subprocess my_data = "" line_count = 0 proc = subprocess.run( args = [ 'cat', 'input.txt' ], universal_newlines = True, stdout = subprocess.PIPE) for text_line in proc.stdout: my_data += text_line line_count += 1 word_file = open('output.txt', 'w') pprint.pprint(my_data, word_file) pprint.pprint(line_count, word_file)
注意:这使用了Python 3.5中的新功能,该功能无法在以前的版本中运行.
我是否需要创建自己的行缓冲逻辑,或者有办法让Python为我做这个吗?
proc.stdout
在你的情况下已经是一个字符串,运行print(type(proc.stdout))
,以确保.它包含所有子subprocess.run()
进程的输出 - 在子进程死亡之前不会返回.
for text_line in proc.stdout:
不正确:for char in text_string
枚举Python中的字符(Unicode代码点),而不是行.要获得线路,请致电:
lines = result.stdout.splitlines()
结果可能.split('\n')
与字符串中有Unicode换行符不同.
如果要逐行读取输出(以避免长时间运行的进程耗尽内存):
from subrocess import Popen, PIPE with Popen(command, stdout=PIPE, universal_newlines=True) as process: for line in process.stdout: do_something_with(line)
注意:process.stdout
在这种情况下,它是一个类似文件的对象.Popen()
不等待进程完成 - Popen()
一旦子进程启动就立即返回.process
是一个subprocess.Popen
实例,而不是CompletedProcess
这里.
如果您只需要计算b'\n'
输出中的行数(以...结尾),例如wc -l
:
from functools import partial with Popen(command, stdout=PIPE) as process: read_chunk = partial(process.stdout.read, 1 << 13) line_count = sum(chunk.count(b'\n') for chunk in iter(read_chunk, b''))
请参阅为什么在C++中读取stdin中的行比Python要慢得多?