如何兼顾Streamlit页面排序与模块导入?解决编号页面导入报错
解决Streamlit页面顺序与Python模块导入冲突的方案
核心矛盾在于:Streamlit依赖数字前缀文件名控制侧边栏页面顺序,但这类文件名违反Python模块命名规范(不能以数字开头),导致单元测试时无法直接导入模块。以下是三种可行的协调方案:
方案1:使用Streamlit页面配置文件指定顺序(推荐)
Streamlit 1.10.0及以上版本支持通过pages.toml配置文件定义页面顺序,无需依赖数字前缀文件名:
- 将
pages目录下的文件名修改为合法的Python模块名,例如:pages\ | abc.py | def.py | ghi.py - 在
src/project目录下创建pages.toml文件,配置页面顺序:
该配置会强制Streamlit按照列表指定的顺序渲染侧边栏页面,完全替代数字前缀的作用。[pages] order = ["Home.py", "pages/abc.py", "pages/def.py", "pages/ghi.py"] - 测试代码即可正常导入:
from project.Home import HomeClass from project.pages.abc import ABCClass from project.pages.def import DEFClass from project.pages.ghi import GHIClass
方案2:在测试代码中使用动态导入
若不想修改现有文件名,可通过Python的importlib模块动态导入不符合命名规范的模块,绕过语法错误:
import importlib # 动态导入模块 home_module = importlib.import_module("project.Home") abc_module = importlib.import_module("project.pages.1_abc") def_module = importlib.import_module("project.pages.2_def") ghi_module = importlib.import_module("project.pages.3_ghi") # 提取需要的类 HomeClass = home_module.HomeClass ABCClass = abc_module.ABCClass DEFClass = def_module.DEFClass GHIClass = ghi_module.GHIClass
此方法无需修改现有项目结构,仅在测试代码中做适配。
方案3:通过__init__.py添加模块别名
在pages目录下创建__init__.py文件,将数字前缀的模块导入并赋予合法别名,测试代码通过别名导入:
- 创建
src/project/pages/__init__.py,内容如下:
Python允许在from .1_abc import ABCClass from .2_def import DEFClass from .3_ghi import GHIClass__init__.py中导入以数字开头的模块,因为此处使用的是字符串形式的模块名。 - 测试代码中直接从
project.pages导入类:
这种方式既保留了原文件名(维持Streamlit页面顺序),又能让测试代码正常导入。from project.Home import HomeClass from project.pages import ABCClass, DEFClass, GHIClass
内容的提问来源于stack exchange,提问作者thegreatjedi
相关产品推荐
相关产品推荐

