Streamlit多页应用pages目录下跨文件夹导入模块报错
问题原因
这个报错和Streamlit忽略文件的规则无关,本质是Python的模块搜索路径逻辑导致的:
- 运行Streamlit项目时,Python默认会把项目根目录(也就是
Title_page.py所在的目录)加入模块搜索路径,不会自动把pages子目录加进去 - 你在
Page2.py里写from p2_functions.func_2 import multiply_two时,Python会去根目录下找p2_functions文件夹,自然找不到,因为这个文件夹存放在pages目录下 - 另外你原有代码里还有个笔误:
multiply_two(10 * 20)是先算出10*20=200,只传了1个参数给接收两个参数的乘法函数,后续就算路径对了也会报参数数量错误,要改成multiply_two(10,20)
解决方法
选任意一种即可:
方法1:临时补充搜索路径(不用改现有目录结构)
在Page2.py的最开头、导入其他业务模块前,把当前文件所在的pages目录加入Python搜索路径,同时给p2_functions文件夹补一个空的__init__.py文件标记为Python包。
- 在
pages/p2_functions/目录下新建空文件,命名为__init__.py - 修改
Page2.py代码如下:
import sys from pathlib import Path # 将当前Page2.py所在的pages目录加入模块搜索路径 sys.path.append(str(Path(__file__).parent)) import streamlit as st from p2_functions.func_2 import multiply_two st.markdown("# Page 2 ") st.write(multiply_two(10, 20))
方法2:调整目录结构(更规范,长期维护推荐)
Streamlit多页模式下,只会把pages目录下直接存放的.py文件识别为页面路由,子目录内的文件不会被当成独立页面,因此更推荐把所有工具函数统一挪到根目录管理,从根源避免路径问题。
调整后的目录结构参考:
├── Title_page.py ├── func_1.py ├── utils │ ├── __init__.py │ └── page2 │ ├── __init__.py │ └── func_2.py └── pages └── Page2.py
这种结构下Page2.py不需要额外加路径处理代码,直接导入即可:
import streamlit as st from utils.page2.func_2 import multiply_two st.markdown("# Page 2 ") st.write(multiply_two(10, 20))
补充说明:Streamlit不会屏蔽pages目录下的非页面py文件,只要路径正确完全可以正常导入,之前的猜测不成立。
内容的提问来源于stack exchange,提问作者user9532692
相关产品推荐
相关产品推荐

