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

尝试多种方案仍无法在Streamlit应用中跨目录导入Python函数

解决Streamlit应用中跨目录导入函数的问题

针对你的情况,Streamlit的运行方式确实会影响Python模块的导入路径,以下是几个可行的解决方案:

方案1:在page1.py中动态添加项目根目录到sys.path

在page1.py开头添加以下代码,确保项目根目录被加入Python的搜索路径:

import sys
import os

# 获取application文件夹的绝对路径
root_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), "../../"))
if root_dir not in sys.path:
    sys.path.append(root_dir)

# 现在可以正常导入
from models.model1 import function1

这里通过os.path.dirname(__file__)获取page1.py的所在目录,再通过../../向上两级定位到application根目录,转换为绝对路径后添加到sys.path,避免了硬编码路径的问题。

方案2:通过环境变量PYTHONPATH指定根目录

在运行Streamlit命令前,先设置PYTHONPATH为项目根目录:

Linux/macOS终端

export PYTHONPATH="/绝对路径/to/application"
streamlit run streamlit/Main.py

Windows PowerShell

$env:PYTHONPATH = "C:\绝对路径\to\application"
streamlit run streamlit/Main.py

注意:必须在同一个终端窗口中执行这两条命令,否则环境变量不会生效。设置后,page1.py中直接使用绝对导入即可:

from models.model1 import function1

方案3:在项目根目录下运行Streamlit命令

切换到application文件夹目录,执行:

streamlit run streamlit/Main.py

此时Python的sys.path会自动包含当前工作目录(即application),你可以直接在page1.py中使用绝对导入,无需额外配置:

from models.model1 import function1

为什么之前的方法没生效?

  • 相对导入失效:当Streamlit加载page1.py时,它会将该文件当作独立脚本运行,而非包的一部分,因此相对导入会报错。
  • sys.path路径错误:如果之前添加的是相对路径,可能会因为Streamlit的工作目录与预期不符而失效,必须使用绝对路径才能确保正确性。
  • __init__.py的作用:添加__init__.py只是将文件夹标记为Python包,但如果根目录不在sys.path中,依然无法找到对应的包。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 13:01:13