启动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
相关产品推荐
相关产品推荐

