在 Streamlit 应用程序上实时写入标准输出

问题描述 投票:0回答:1

我正在尝试显示我使用 Streamlit 实时调用的 Python 脚本的标准输出。我已经使用 subprocess Popen 来调用我的 python 脚本,但是在到达 subprocess.popen() 行后出现了延迟,并且脚本在大约 30-40 秒后开始运行。我在脚本顶部放置了一条打印语句来检查这一点。延迟背后有什么原因吗?

Streamlit 应用程序:

import streamlit as st
import subprocess

start_button = st.button("Run External Script")

if start_button:
    command = ["python", script.py]
    process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True)
    
    while process.poll() is None:
        line = process.stdout.readline()
        if not line:
           continue
        st.write(line.strip())

脚本.py:

import time

print("Start")
time.sleep(1)
print("Working")
time.sleep(1)
print("Stop")

我希望 subprocess.Popen() 运行后打印语句就会显示出来,但有一个延迟,所有语句都会立即显示,中间没有 time.sleep 。

如果我使用 subprocess.call(),我可以在 VSCode 终端中看到实时生成的输出,没有延迟。 有没有办法在Streamlit应用程序中实时写入而不延迟。

python subprocess streamlit
1个回答
0
投票

问题是 python stdout 是缓冲的,这就是为什么只有在

process.stdout
运行后才能读取
process
。有几种方法可以禁用缓冲,最简单的可能是添加
-u
作为参数:

import streamlit as st
import subprocess

start_button = st.button("Run External Script")

if start_button:

    command = ["python", '-u', 'script.py']
    process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True)

    while process.poll() is None:
        line = process.stdout.readline()
        if not line:
            continue
        st.write(line.strip())
© www.soinside.com 2019 - 2024. All rights reserved.