【问题标题】:Python: Subprocess.popen stdout: not in real time bufferPython:Subprocess.popen stdout:不在实时缓冲区中
【发布时间】:2021-09-03 06:59:03
【问题描述】:

为了在子进程中实时捕获 python scrypt 的标准输出,我花了很长时间。

解决方案

ma​​in.py

import subprocess
import io
import time
import sys

if __name__ == '__main__':

    command = ["python", "-u", "createValue.py"] # "-u" changed my life

    p = subprocess.Popen(command,
                         stdout=subprocess.PIPE,
                         stderr=subprocess.STDOUT)

    for line in iter(p.stdout.readline, b''):
        print(">>> " + str(line.rstrip()))

createValue.py


import time
import sys

i = 0

while i < 5:

    print("I like pizza "+ str(i))
    # sys.stdout.flush() # This is an another solution
    time.sleep(1.5)

    i += 1

为什么 Internet 上的每个解决方案都可以在没有“-u”的情况下运行,但在我的 PC 上却不行? 我使用 Python 3.6.5

【问题讨论】:

  • AFAIK,-u 表示无缓冲,意思是:Python 不会缓冲输出,它会在数据指向 stdout 时立即将其发回。这不是你想要的吗?我没有发现您的代码有任何问题。
  • 是的,它可以在没有“-u”的情况下实时工作吗?互联网上的每个解决方案都不使用“-u” 示例1:stackoverflow.com/questions/1606795/… 示例2:stackoverflow.com/questions/18421757/…

标签: python subprocess buffer real-time stdout


【解决方案1】:

是的,这是因为你需要添加一个名为 PYTHONUNBUFFERED 的环境变量并将其设置为 = 1

"...将 PYTHONUNBUFFERED 设置为非空值可确保将 python 输出直接发送到终端..."

使用您的代码检查以下解决方案:

import os # Added this line
import subprocess
import io
import time
import sys

if __name__ == '__main__':
    os.environ["PYTHONUNBUFFERED"] = "1" # Added
    command = ["python", "createValue.py"] # Removed "-u"

    p = subprocess.Popen(command,  
                         stdout=subprocess.PIPE,
                         stderr=subprocess.STDOUT)
    print("init")
    for line in iter(p.stdout.readline, b''):
        print(">>> " + str(line.rstrip()))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-30
    • 2011-08-02
    • 2018-06-27
    • 1970-01-01
    • 2017-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多