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

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包。

  1. 在pages/p2_functions/目录下新建空文件,命名为__init__.py
  2. 修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 09:36:17