You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

启动Streamlit应用时代码多次执行的原因咨询

启动Streamlit时日志重复打印的原因及解决办法

核心原因:Streamlit启动阶段的多次脚本执行

Streamlit在启动过程中并非只执行一次脚本,而是会因内部机制触发多次执行,这就是日志重复打印的根源,具体场景包括:

  • 初始化流程:启动时Streamlit会先执行脚本完成环境初始化、组件注册等操作,随后再执行一次用于渲染前端内容。
  • 开发模式热重载:默认启动的开发模式下,Streamlit会自动监听文件变化,启动阶段可能触发1-2次额外的脚本重跑,用于确认文件状态。
  • 前端资源同步:为保证前后端状态一致,部分场景下会触发脚本的额外执行。

而刷新浏览器时是用户主动触发的单次会话请求,Streamlit仅执行一次脚本,因此日志只打印一次。

验证方法

可以在脚本中添加进程ID或会话状态打印,确认每次日志对应的执行实例不同:

import os
import streamlit as st
from streamlit.logger import get_logger
import logging

LOGGER = get_logger(__name__)
LOGGER.setLevel(logging.DEBUG)

LOGGER.debug(f'start of streamlit_test | PID: {os.getpid()} | Session ID: {st.session_state.get("session_id", "new")}')
st.session_state["session_id"] = st.session_state.get("session_id", os.urandom(4).hex())
st.write("hello")
LOGGER.debug(f'end of streamlit_test | PID: {os.getpid()} | Session ID: {st.session_state["session_id"]}')

运行后会发现,启动时的日志对应不同的PID或会话ID,说明是多次脚本执行导致的重复。

解决办法

1. 关闭开发模式热重载

启动时添加参数禁用自动重跑:

streamlit run streamlit_test.py --server.runOnSave false

这样启动阶段只会执行一次脚本,日志不再重复。

2. 用会话状态标记首次执行

通过st.session_state记录是否已经初始化,避免重复打印日志:

import streamlit as st
from streamlit.logger import get_logger
import logging

LOGGER = get_logger(__name__)
LOGGER.setLevel(logging.DEBUG)

# 仅在首次会话时打印启动日志
if not st.session_state.get("is_initialized", False):
    LOGGER.debug(f'start of streamlit_test')
    st.session_state["is_initialized"] = True

st.write("hello")

# 确保结束日志仅打印一次
if st.session_state.get("is_initialized", False):
    LOGGER.debug(f'end of streamlit_test')

内容的提问来源于stack exchange,提问作者Juan Gong

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 00:05:23