【问题标题】:Streaming output from Popen来自 Popen 的流式输出
【发布时间】:2021-04-01 02:12:38
【问题描述】:

处理完成后,Popen 输出总是以字节数组的形式立即到达,我尝试了几种配置,包括使用标准输出文件。

要创建进度条,我想一一接收输出。在此示例中,只有一个 p.stdout.read() 将所有 1 作为字节数组返回。

Example in Google Colab

# shell.py
import sys, time

for _ in range(5):
    print(1)
    time.sleep(0.5)
    sys.stdout.flush()

# code.py
from subprocess import Popen, PIPE

p = Popen(['python', 'shell.py'],
        stdin = PIPE, stdout = PIPE, stderr = PIPE, shell = False, bufsize=1)

output = p.stdout.read()
while output:
    print('output:', output)
    output = p.stdout.read()

【问题讨论】:

  • 很想知道这是如何工作的。我还尝试将出于相同目的的标准输出发送到文件,然后只是 cating 文件以查看会发生什么。似乎 stdout 没有流式传输到文件,而仅在进程完成时才转储,并且传递 BytesIO 或 StringIO 对象似乎给出了错误

标签: python subprocess popen


【解决方案1】:

您可以指定 read() 将读取多少字节。如果您在 code.py 中使用 p.stdout.read(1),您的代码将按您的意愿运行。请注意,python 的 print 函数会在 shell.py 的输出中添加换行符,因此 code.py 会打印出来:

output: b'1'
output: b'\n'
output: b'1'
output: b'\n'
output: b'1'
output: b'\n'

另外值得一提的是,这将读取 bytes。如果你想要一个一个的 unicode 字符,你必须自己做一些处理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-09
    相关资源
    最近更新 更多