根据 Python 3.5 文档,subprocess.run() 返回一个 CompletedProcess 对象,其 stdout 成员包含“一个字节序列,或者一个字符串,如果 run() 是使用 universal_newlines=True 调用的。”我只看到一个字节序列而不是一个字符串,我假设(希望)它等同于一个文本行。例如,
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 为我做这件事?
原文由 highpost 发布,翻译遵循 CC BY-SA 4.0 许可协议
proc.stdout
在你的情况下已经是一个字符串,运行print(type(proc.stdout))
,以确保。它包含所有子进程的输出 --subprocess.run()
在子进程死亡之前不会返回。for text_line in proc.stdout:
不正确:for char in text_string
枚举 Python 中的字符(Unicode 代码点),而不是行。要获取线路,请致电:如果字符串中有 Unicode 换行符,结果可能与
.split('\n')
不同。如果您想逐行读取输出(以避免长时间运行的进程耗尽内存):
注意:
process.stdout
在这种情况下是一个类文件对象。Popen()
不等待进程完成 --Popen()
子进程启动后立即返回。process
是一个subprocess.Popen
实例,而不是CompletedProcess
在这里。如果您只需要计算输出中的行数(由
b'\n'
终止),例如wc -l
:请参阅 为什么在 C++ 中从 stdin 读取行比 Python 慢得多?