我正在尝试显示我使用 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 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())