整理 Streamlit 应用程序文件¶
将应用程序部署到 Streamlit in Snowflake 时,应用的入口文件可以使用任何符合标准命名规则的名称,并且可以位于应用程序源目录中的任何位置。应用程序的源目录可以包含其他文件,例如页面脚本、Python 模块、媒体文件和配置文件。
应用程序来源目录的根目录是 Streamlit 的工作目录。如果在本地开发和运行应用程序,这意味着您必须从来源目录的根目录执行 streamlit run 命令,以确保所有路径都正确。
当您从 Snowsight 初始化 Streamlit 应用程序或使用 CREATE STREAMLIT 而未指定源位置时,Streamlit 对象的嵌入暂存区会在其根目录中包含一个入口文件。您可以使用文件资源管理器添加其他文件。如果需要重命名或移动入口文件,必须使用 SQL 命令更新 Streamlit 对象的 MAIN_FILE 值。
备注
如果您使用 CREATE STREAMLIT 命令与 ROOT_LOCATION 参数,您的应用程序只能使用仓库运行时,并且受到其他限制。本页涵盖使用 FROM 参数创建的应用程序。有关更多信息,请参阅 了解不同类型的 Streamlit 对象。
容器运行时文件结构¶
使用容器运行时时,入口文件可以使用任何符合标准命名规则的名称,并且可以位于源目录中的任何位置。然而,随着 Streamlit v1.36 引入了 st.navigation (https://docs.streamlit.io/develop/api-reference/navigation/st.navigation),最常见的做法是使用 streamlit_app.py 作为入口文件,因为页面名称不必从文件名推断。
Snowflake 会从来源目录的根目录执行 streamlit run 命令,因此您必须相应地处理路径。
入口点文件可以具有任何名称,并且可以位于来源目录中的任何位置。
依赖项文件可以位于从来源目录的根目录到入口文件所在目录之间的任何目录中。有关更多信息,请参阅 管理 Streamlit 应用程序的依赖项。
您可以在来源目录的根目录和入口文件所在目录之间拥有一个或多个
.streamlit/目录。来源目录的根目录是 Streamlit 的工作目录。
以下目录结构对容器运行时 Streamlit 应用程序有效:
source_directory/
├── .streamlit/ # Optional configuration
│ ├── config.toml
│ └── secrets.toml
├── page_1.py # Page 1
├── page_2.py # Page 2
├── pyproject.toml # Python dependencies
├── streamlit_app.py # Entrypoint file
└── uv.lock # Auto-generated lockfile
以下目录结构显示了一个来源目录中的两个应用程序,每个应用程序都有自己的入口点文件和依赖关系。在此示例中,存在两个不同的 Streamlit 对象。两个 Streamlit 对象都将 FROM 设置为由 source_directory 表示的位置,但每个对象都将 MAIN_FILE 设置为不同的 streamlit_app.py 文件。第一个应用程序使用 pyproject.toml 文件的依赖关系,而第二个应用程序使用 requirements.txt 文件。
source_directory/
├── .streamlit/ # Shared configuration
│ ├── config.toml
│ └── secrets.toml
├── app_one/ # First app source directory
│ ├── .streamlit/ # Overriding first-app configuration
│ │ ├── config.toml
│ │ └── secrets.toml
│ ├── page_1.py
│ ├── page_2.py
│ ├── pyproject.toml # Python dependencies for first app
│ ├── streamlit_app.py # Entrypoint file for first app
│ └── uv.lock
├── app_two/ # Second app source directory
│ ├── requirements.txt # Python dependencies for second app
│ ├── page_1.py
│ ├── page_2.py
│ ├── streamlit_app.py # Entrypoint file for second app
│ └── uv.lock
└── utils/ # Shared modules
└── helper.py
重要
某些 Streamlit 功能需要相对于工作目录的路径,而其他功能则需要相对于入口点文件的路径。
通常,应用程序中图像和其他媒体的路径应相对于工作目录(来源目录的根目录)。但是,多页面应用程序中其他页面的路径与入口点文件的位置相关。
为避免混淆,请考虑组织应用程序文件,使入口点文件位于来源目录的根目录中。您可以在一个 Git 存储库中保存多个应用程序,并将子目录传递给创建 Streamlit 对象时的 FROM 参数。该子目录就是应用程序的来源目录。在前面的示例中,这意味着在 FROM 参数中使用 source_directory/app_one 和 source_directory/app_two。不过,在这种情况下,应用程序将无法访问 source_directory/utils 中的共享模块。
仓库运行时文件结构¶
当使用仓库运行时,入口点文件可以有任何名称,但必须位于来源目录的根目录中。您的 Python 版本和依赖关系将在来源目录根目录中的 environment.yml 文件中指定。如果不包括 environment.yml 文件,应用将使用当前在 Streamlit in Snowflake 中 Streamlit 所支持的最新版本的 Python 和 Streamlit。如果您在 Snowsight 中使用 包选择器 添加包,environment.yml 文件会自动为您更新或创建。
以下目录结构对仓库运行时 Streamlit 应用程序有效:
source_directory/
├── .streamlit/ # Optional configuration
│ └── config.toml
├── environment.yml # Conda dependencies
├── page_1.py
├── page_2.py
└── streamlit_app.py # Entrypoint file
从其他暂存区导入模块和文件¶
CREATE STREAMLIT 和 ALTER STREAMLIT 命令支持 IMPORTS 参数,允许您将其他暂存区的其他文件导入应用程序的来源目录。如果您有一组常用模块或文件,希望在多个应用程序之间共享,可以将它们存储在某个暂存区,并通过 IMPORTS 参数导入到每个应用程序中。但是,只有使用仓库运行时的应用程序才支持此功能。
多页面应用程序¶
Streamlit 支持两种创建多页面应用程序的方法:
使用
st.navigation:在导航菜单中,选择 ,然后选择您的动态表。您可以使用st.navigation命令,用于在应用程序中创建自定义导航结构。这允许您以编程方式定义页面并控制导航流。入口点文件的作用类似于页面路由器,应用程序的页面可以在来源目录中的任何位置定义为函数或 Python 脚本。这是创建多页面应用程序的推荐方法,因为它提供了最大的灵活性。使用
pages/目录:您可以在应用的入口文件旁创建一个名为pages/的目录。入口点文件被视为应用程序的主页。pages/目录中的每个 Python 文件被视为应用程序中的附加页面。页面名称源自文件名。
不能混合使用这两种方法来创建多页面应用程序。有关多页面应用程序的更多信息,请参阅 Streamlit 文档中的 多页面应用程序概述 (https://docs.streamlit.io/develop/concepts/multipage-apps/overview)。
备注
当您在 Streamlit in Snowflake 中托管多页应用程序时,URL 路径名会加上前缀 /!。例如,在一个多页面应用中,如果某个页面的相对路径为 /page2,则它在 Streamlit in Snowflake 中的路径将变为 /!/page2,如以下 URL 所示:https://app.snowflake.cn/org/account_name/#/streamlit-apps/DB.SCHEMA.APP_NAME/!/page_2
更新入口点文件¶
如果重命名或移动入口点文件,则必须使用 SQL 命令更新 Streamlit 对象以使用新的入口点文件。如果将入口点文件移动到子目录,则必须使用容器运行时。
使用 ALTER STREAMLIT 命令更改 Streamlit 对象的 MAIN_FILE 参数,如以下示例所示:
ALTER STREAMLIT my_streamlit_app SET MAIN_FILE = 'subdir/new_entrypoint.py';
这个示例将
my_streamlit_appStreamlit 对象的入口文件更改为subdir/new_entrypoint.py。