尝试多种方案仍无法在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
相关产品推荐
相关产品推荐

