管理 Streamlit 应用程序的依赖项

默认情况下,Streamlit in Snowflake 环境已安装 Python、Streamlit 和 Snowflake Snowpark。管理应用程序依赖项的方式因您选择的运行时环境而异:

  • 容器运行时通过 uv (https://docs.astral.sh/uv/) 管理包。您可以在 pyproject.toml (推荐)或 requirements.txt 文件中指定依赖项。默认情况下,您的应用程序无权访问包索引,例如 PyPI。因此,如果要编辑或指定应用程序依赖项的版本,则必须创建外部访问集成 (EAI)。此外,您还可以从项目目录中包含的 wheel 文件安装包。

  • 仓库运行时通过 conda (https://docs.conda.io/en/latest/) 管理包。您可以通过 environment.yml 文件或 Snowsight 内置的包选择器来指定依赖项。仅支持从 Snowflake Anaconda Channel (https://repo.anaconda.com/pkgs/snowflake/) 安装包。

要了解如何在已部署的应用程序中添加或编辑文件,请参阅 编辑已部署的 Streamlit 应用程序

支持的依赖项源

仓库运行时

容器运行时

PyPI 或其他外部 "simple" (https://peps.python.org/pep-0503/) 包索引

是(使用 EAI)

Snowflake Anaconda Channel

是,但对 Streamlit 版本有限制

内部暂存区

是,但只能通过应用程序源文件中的相对路径

Snowflake Artifact Repository (snowflake.snowpark.pypi_shared_repository)

受支持的 Python 版本

新创建的 Streamlit in Snowflake 应用程序默认使用 Python 3.11 运行。

  • 对于容器运行时,Python 3.11 是目前唯一支持的版本。

  • 对于仓库运行时,您可以选择 Python 3.9、3.10 或 3.11。

支持的 Streamlit 版本

新创建的 Streamlit in Snowflake 应用程序使用其运行时环境中可用的受支持的最新 Streamlit 版本。当 Streamlit 发布新版本时,新版本可能需要一段时间才会成为默认版本。

  • 对于容器运行时,所需的最低 Streamlit 版本为 1.50。您可以使用 Streamlit 的任何更高版本,包括 streamlit-nightly 版本。

    重要

    streamlit-nightly 版本是实验性的。有关更多信息,请参阅 Streamlit 文档中的 夜间版本发布说明 (https://docs.streamlit.io/develop/quick-reference/prerelease#nightly-releases)。

    您可以通过包索引安装最新的 Streamlit 版本,从而立即使用该版本。

  • 对于仓库运行时,您只能使用从 1.22.0 开始的版本子集。streamlit-nightly 版本不受支持。

    无法立即在仓库运行时中使用最新的 Streamlit 版本。

为防止意外的包升级,请按照本页所述配置应用程序的依赖项。

仓库运行时中支持的 Streamlit 库版本

Streamlit in Snowflake 支持以下 Streamlit 开源库版本:

  • 1.51.0

  • 1.50.0

  • 1.49.1

  • 1.48.0

  • 1.47.0

  • 1.46.1

  • 1.45.1

  • 1.45.0

  • 1.44.1

  • 1.44.0

  • 1.42.0

  • 1.39.0

  • 1.35.0

  • 1.31.1

  • 1.29.0

  • 1.26.0

  • 1.22.0

非 Python 依赖项

某些 Python 包需要在运行时环境中安装非 Python 系统库。例如, Pillow 包需要处理不同图像格式的库。

  • 对于容器运行时中的非 Python 依赖项,只能使用预安装的系统库。尚不支持安装其他非 Python 依赖项。

  • 对于仓库运行时中的非 Python 依赖项,Snowflake Anaconda Channel 中提供了一些系统库。

声明依赖项的最佳实践

声明应用程序的依赖项时,请考虑以下最佳实践:

  • 固定关键包版本。

    • 对于容器运行时,请使用 pyproject.tomlrequirements.txt 文件中的 == 运算符。

    • 对于仓库运行时,请使用 environment.yml 文件中的 = 运算符。

  • 使用版本范围以提高灵活性。

    • 对于容器运行时,请使用 pyproject.tomlrequirements.txt 文件中的 <, <=, >=, and > 运算符。

    • 对于仓库运行时,请使用 environment.yml 文件中的 * 通配符后缀。

  • 尽量减少依赖项列表,以缩短构建时间。

  • 在部署之前测试开发中的依赖项变更。

  • 确保依赖项与运行时中的 Python 版本兼容。

在运行时之间迁移或更改包管理器时,请查看依赖项名称。例如,某些包在 Conda 和 PyPI 之间具有不同的名称:

Conda 名称

PyPI 名称

Pillow

pillow

Pillow

OpenCV

opencv

opencv-python

PyYAML

pyyaml

PyYAML

管理容器运行时的依赖项

容器运行时应用程序需要外部访问集成 (EAI) 以从外部包索引(例如 PyPI)安装包。没有 EAI,您只能使用运行时附带的包或包含在应用程序源文件中的包。

即使你只想指定 Streamlit 的版本,也必须在应用程序中包含一个 EAI。没有 EAI,如果尝试在预安装的包上使用版本说明符,则在更新运行时基础镜像时可能会遇到错误。这是因为版本说明符可能不再与预安装的包兼容。

容器运行时的外部访问集成

有关外部访问集成 (EAIs) 的总体概述,请参阅 外部网络访问概述

PyPI EAI

PyPI 是 uv 用于在容器运行时中安装 Python 包的默认包索引。要为 PyPI 创建 EAI,您需要一个允许访问所有必要 PyPI 域名的网络规则。EAIs 通常由您的账户管理员或安全团队创建和维护。

例如,以下 SQL 命令创建了一个连接 PyPI 的 EAI (pypi_access_integration),并授予 app-development 角色 (app_developer_role) USAGE 权限。

CREATE OR REPLACE NETWORK RULE pypi_network_rule
  MODE = EGRESS
  TYPE = HOST_PORT
  VALUE_LIST = ('pypi.org', 'pypi.python.org', 'pythonhosted.org', 'files.pythonhosted.org');

CREATE OR REPLACE EXTERNAL ACCESS INTEGRATION pypi_access_integration
  ALLOWED_NETWORK_RULES = (pypi_network_rule)
  ENABLED = true;

GRANT USAGE ON EXTERNAL ACCESS INTEGRATION pypi_access_integration TO ROLE app_developer_role;
Copy

创建后 EAI,您需要将其添加到 Streamlit 对象中。您可以在 Snowsight 中操作,或通过 SQL 实现:

  1. 登录 Snowsight

  2. 在导航菜单中选择 Projects » Streamlit,然后选择应用程序。

  3. 在右上角,选择 三个垂直点表示更多选项 (更多选项) » App settings

  4. App settings 对话框中,选择 External networks 选项卡。

  5. 从可用 EAIs 列表中,选择 PyPI 的 EAI。

  6. 要保存更改并关闭对话框,请选择 Save

依赖项文件

容器运行时使用 uv 进行快速、可靠的依赖项解析。uv 的工作方式类似于 pip,用于安装 Python 包,但它的性能更高,可自定义性更强。有关 uv 功能的更多信息,请参阅 uv 文档中的 功能 (https://docs.astral.sh/uv/getting-started/features/) 概述。

容器运行时在与应用程序入口点文件相同的目录中搜索依赖项文件。如果未找到依赖项文件,搜索将继续沿目录树向上进行,直到到达应用程序源位置的根目录。找到的第一个依赖项文件用于安装应用程序的依赖项。

当同一目录下存在多个依赖文件时,它们将按以下优先级顺序使用:

  • requirements.txt:选择使用 时默认使用的角色和仓库。列出 Streamlit 应用程序所需的 Python 包和版本,包括 Streamlit 本身。您不能使用 requirements.txt 配置 Python 版本。

    有关 requirements.txt 格式的更多信息,请参阅 在 pip 文档中的 需求文件格式 (https://pip.pypa.io/en/stable/reference/requirements-file-format/)。

  • pyproject.toml (推荐):管理 Python 版本和依赖项。目前,仅支持 Python 版本 3.11。当您提供 pyproject.toml 文件时,uv 将生成 uv.lock 文件来锁定依赖项版本。每当您更新依赖项时,都会更新此锁定文件。若需使用 PyPI 以外的其他包索引,必须使用 pyproject.toml

    有关 pyproject.toml 格式的更多信息,请参阅 Python 文档中的 编写 pyproject.toml (https://packaging.python.org/en/latest/guides/writing-pyproject-toml/)。

requirements.txt 是声明应用程序依赖项的最简单方法,旨在方便入门。但是,对于更高级的依赖项管理,Snowflake 建议改用 pyproject.toml。例如,这允许您锁定依赖项版本,以确保构建的可重现性。

小技巧

  • 只要您的应用程序被分配了必要的 EAI ,您就可以从任何 URL 安装包。需要身份验证的 URLs 必须支持嵌入式凭据。

  • 您可以通过使用依赖文件到 wheel 文件的相对路径,从项目目录内安装包。

  • 如果您对预安装的包使用了版本限定符,则必须具有一个指向包索引的 EAI,以避免运行时基础镜像更新时出现错误。

通常,您的入口点文件和依赖项文件会位于项目目录的根目录下。但是,您的入口点文件可以位于子目录中,而您的依赖项文件可以位于同一目录或直至项目根目录的任何父级目录中。

例如,您的项目目录可能具有以下结构之一:

source_directory/
├── requirements.txt
└── streamlit_app.py
Copy
source_directory/
├── pyproject.toml
├── streamlit_app.py
└── uv.lock
Copy
source_directory/
├── pyproject.toml
├── subdirectory/
│   └── streamlit_app.py
└── uv.lock
Copy
source_directory/
└── subdirectory/
    ├── pyproject.toml
    ├── streamlit_app.py
    └── uv.lock
Copy

备注

容器运行时将把包含依赖文件的目录用作 uv 的工作目录。因此,如果您要从应用程序源文件中使用相对路径安装包,该路径应是相对于依赖文件所在的位置。有关声明包来源的更多信息,请参阅 uv 文档中的 依赖项来源 (https://docs.astral.sh/uv/concepts/projects/dependencies/#dependency-sources)。

PyPI 依赖项文件示例

您的 pyproject.toml 文件必须包含 nameversion,以满足 uv 的有效格式要求,但其具体值可以任意填写。使用 requires-python 来设置您的 Python 版本,尽管容器运行时目前仅支持 Python 3.11。使用 dependencies 来为您的容器运行时列出所需的 Python 包。

小技巧

请以 streamlit[snowflake] 的形式安装 Streamlit,以包含其 Snowflake 连接器依赖项 (snowflake-snowpark-python)。

如果您已拥有用于 PyPI 的 EAI,以下 pyproject.toml 文件示例声明了最低 Python 版本为 3.11,并包含了五个将从 PyPI 安装的 Python 包:

[project]
name = "my-streamlit-app"
version = "0.1.0"
requires-python = ">=3.11"
dependencies = [
    "streamlit[snowflake]==1.50.0",
    "pandas>=2.0.0",
    "plotly>5.0.0",
    "requests>2.0.0,<3.0.0"
]
Copy

作为 pyproject.toml 的替代方案,您可以使用 requirements.txt 文件来声明应用的依赖项。以下 requirements.txt 包含了与之前 pyproject.toml 示例相同的 Python 包:

streamlit[snowflake]==1.50.0
pandas>=2.0.0
plotly>5.0.0
requests>2.0.0,<3.0.0
Copy

备注

要固定包的版本,必须使用 == 运算符。要指定版本范围,必须使用 <, <=, >=, and > 运算符。例如, pandas>=2.0.0,<3.0.0 将安装 2.0.0 和 2.99.99 之间的任何版本。有关更多信息,请参阅 依赖项说明符 (https://packaging.python.org/en/latest/specifications/dependency-specifiers/)。

JFrog 依赖项文件示例

为了提高安全性,系统管理员可能会要求您使用精选或专用包索引,例如 JFrog Artifactory。这是容器运行时的独有功能。使用 JFrog,您可以创建一个公共或专用包索引,用于代理 PyPI 或托管自定义包。这使您能够控制哪些包及版本可供您的 Streamlit 应用程序使用。

要指定包索引,必须使用 pyproject.toml。有关更多信息,请参阅 uv 文档中的 使用替代包索引 (https://docs.astral.sh/uv/guides/integration/alternative-indexes/)。

以下 pyproject.toml 文件声明了最低 Python 版本为 3.11,包含五个 Python 包,并指定了 JFrog 作为代理 PyPI 的包索引:

[project]
name = "my-streamlit-app"
version = "0.1.0"
requires-python = ">=3.11"
dependencies = [
    "streamlit[snowflake]==1.50.0",
    "pandas>=2.0.0",
    "plotly>=5.0.0",
    "requests>2.0.0,<3.0.0"
]

[[tool.uv.index]]
name = "jfrog"
url = "<server_name>.jfrog.io/artifactory/api/pypi/<repository_key>/simple"
default = true
Copy

如果您的 JFrog 存储库需要身份验证,请生成一个个人访问令牌或从您的 JFrog 系统管理员处获取一个作用域令牌。然后,将令牌包含在 URL 中。请勿在 URL 中使用您的 JFrog 密码。在这种情况下,前例中的 [[tool.uv.index]] 表应替换为以下内容:

[[tool.uv.index]]
name = "jfrog"
url = "https://<username>:<access_token>@<server_name>.jfrog.io/artifactory/api/pypi/<repository_key>/simple"
default = true
Copy

管理仓库运行时的依赖项

仓库运行时使用 conda 来管理应用程序的依赖项。您可以通过 environment.yml 文件或 Snowsight 内置的包选择器来声明依赖项。依赖项将从 Snowflake Anaconda Channel (https://repo.anaconda.com/pkgs/snowflake/) 安装,该频道同时包含 Python 包和一些非 Python 的系统库。

Snowflake Anaconda Channel 中包含的 Streamlit 版本数量,多于 Streamlit in Snowflake 仓库运行时所支持的版本。为避免兼容性问题,请仅使用 仓库运行时中支持的 Streamlit 库版本 中列出的版本。除此之外,您可以安装 Snowflake Anaconda Channel 中提供的任何其他包。

environment.yml 文件

要在仓库运行时环境中使用 environment.yml 文件安装依赖项,请在应用程序源代码根目录下创建或编辑该文件。如果您不提供 environment.yml 文件,Snowflake 仅您所选环境中预装的包。有关 environment.yml 结构的更多信息,请参阅 conda 文档 (https://docs.conda.io/projects/conda/en/latest/user-guide/tasks/manage-environments.html#creating-an-environment-file-manually)。

在 Streamlit in Snowflake 仓库运行时中使用 environment.yml 文件时,适用以下限制:

  • 您只能使用 Snowflake Anaconda Channel 来安装包。

  • 您只能使用 仓库运行时中支持的 Streamlit 库版本 中列出的 Streamlit 版本。

  • 您不能在 dependencies 部分声明 pip 包,包括指向本地包的相对路径。

以下 environment.yml 声明了 Python 3.11 和五个 Python 包:

name: my-streamlit-app
channels:
  - snowflake
dependencies:
  - python=3.11
  - streamlit=1.50.0
  - pandas=2.*
  - plotly=5.0.*
  - requests
  - snowflake-snowpark-python
Copy

Snowflake 建议固定 Streamlit 的某个版本,以防止当 Snowflake Anaconda 通道中发布新版本的 Streamlit 时,升级该应用程序。

备注

要固定包的版本,必须使用 = 运算符。要指定版本范围,必须使用 * 通配符。例如,pandas=2.* 将安装 2.0.0 和 2.99.99 之间的任何 pandas 版本。

使用 conda 进行本地开发

当使用 conda 在本地开发仓库运行时应用程序时,必须在您的 environment.yml 文件中包含额外的详细信息,以确保正确安装依赖项。

  • 通过其 URL 识别 Snowflake Anaconda Channel:https://repo.anaconda.com/pkgs/snowflake

  • 屏蔽默认通道。

在您的 environment.yml 文件中,请使用以下两个通道:

channels:
  - https://repo.anaconda.com/pkgs/snowflake
  - nodefaults
Copy

如果您的 ~/.condarc 文件中存在 defaults,请将其注释掉:

channels:
  # - defaults
Copy

Snowsight 包选择器

除了直接为您的仓库运行时应用编辑 environment.yml 文件外,您还可以使用 Snowsight 中的内置包选择器来添加或移除应用环境中的包。包选择器仅适用于使用仓库运行时的应用程序。此外,包选择器仅显示与应用程序的当前 Python 版本兼容的包。一些与 Python 版本无关的系统库可能不会在包选择器中显示,必须手动添加到 environment.yml 中。

  1. 登录 Snowsight

  2. 在导航菜单中选择 Projects » Streamlit,然后选择您的 Streamlit 应用程序。

  3. 选择右上角的 Edit

  4. 在编辑器窗格的左上角,选择 Packages

    此时会出现一个下拉窗格,并默认选中 Anaconda Packages 选项卡。

  5. 执行以下任意操作:

  • 要设置 Python 版本,在 Python version 选择器中,选择所需的版本。

  • 要添加包,使用搜索栏按名称查找包,然后选择所需的包。

  • 要移除包,在 Installed Packages 部分,选择包版本右侧的 x 图标。

  • 要设置已安装包的版本,在 Installed Packages 部分,使用包名称旁边的版本选择器。

Snowflake 会自动更新您的 environment.yml 文件并重新启动您的应用程序。如果您在编辑器中打开了 environment.yml 文件,请刷新页面以查看更改。

语言: 中文