在Streamlit中无法拼接以user_开头的DataFrames问题求助
在Streamlit中拼接以user_开头的DataFrames报错的解决方法
错误原因
你在Streamlit代码里使用eval(st.session_state.name)的方式完全错误:
st.session_state是Streamlit的类字典状态容器,你存入的user_df1、user_df2是该容器的键值对,并非全局/局部命名空间中的变量。eval()会在全局/局部作用域查找变量名,自然找不到存在st.session_state里的DataFrame,因此触发报错。- 普通Python环境中能运行,是因为你的DataFrame直接定义在全局作用域,
eval()可以正常找到对应变量。
修正方案
直接通过st.session_state[key]的方式获取对应DataFrame,完全不需要eval()。
完整修正代码
import streamlit as st import pandas as pd st.set_page_config(page_title="Science", layout='wide', initial_sidebar_state="expanded") # 示例DataFrames st.session_state.user_df1 = pd.DataFrame({'A': [1, 2], 'B': [3, 4]}) st.session_state.user_df2 = pd.DataFrame({'A': [5, 6], 'B': [7, 8]}) st.session_state.df3 = pd.DataFrame({'A': [1, 2], 'B': [3, 4]}) # 筛选所有以user_开头的键名 st.session_state.users_list = [name for name in st.session_state if name.startswith('user_')] st.write(st.session_state.users_list) # 直接从session_state中提取DataFrames并拼接 user_dfs = [st.session_state[name] for name in st.session_state.users_list] st.session_state.df_final = pd.concat(user_dfs, ignore_index=True) st.table(st.session_state.df_final)
额外说明
这种写法不仅解决了报错问题,还规避了eval()带来的安全风险(执行字符串代码可能存在注入隐患),同时更贴合Streamlit的状态管理设计逻辑。
内容的提问来源于stack exchange,提问作者ViSa
相关产品推荐
相关产品推荐

