Gerenciamento de dependências para o app Streamlit

Por padrão, os ambientes Streamlit in Snowflake vêm com o Python, o Streamlit e o Snowflake Snowpark instalados. A forma como você gerencia as dependências do seu app muda de acordo com o ambiente de tempo de execução escolhido:

  • Os tempos de execução de contêiner gerenciam pacotes com uv. É possível especificar dependências em um arquivo pyproject.toml (recomendado) ou requirements.txt. Por padrão, o app não tem acesso a um índice de pacotes como PyPI. Portanto, se você quiser editar ou especificar as versões das dependências do app, você deve criar uma integração de acesso externo (EAI). Além disso, você pode instalar pacotes de arquivos wheel incluídos no diretório do projeto.

  • Os tempos de execução do warehouse gerenciam pacotes com conda. Você pode especificar dependências usando um arquivo environment.yml ou o seletor de pacotes integrado no Snowsight. Você só pode instalar pacotes listados no canal Snowflake Anaconda.

Para saber como adicionar ou editar arquivos no app implantado, consulte Edição de um aplicativo Streamlit implantado.

Fontes de dependência compatíveis

Tempo de execução de warehouse

Tempo de execução de contêiner

PyPI ou outros índices de pacotes externos «simples»

Não

Sim (com EAI)

Canal Snowflake Anaconda

Sim, com limitações nas versões do Streamlit

Não

Estágio interno

Não

Sim, mas apenas por meio de caminhos relativos nos arquivos de origem do app

Repositório de artefatos do Snowflake (snowflake.snowpark.pypi_shared_repository)

Não

Não

Versões compatíveis do Python

Os aplicativos Streamlit in Snowflake recém-criados são executados no Python 3.11 por padrão.

  • Para tempos de execução de contêiner, o Python 3.11 é a única versão compatível por enquanto.

  • Para tempos de execução de warehouse, você pode escolher entre o Python 3.9, 3.10 e 3.11.

Versões compatíveis do Streamlit

Os apps Streamlit in Snowflake recém-criados usam a versão com suporte mais recente do Streamlit disponível no ambiente de tempo de execução deles. Quando uma nova versão do Streamlit é lançada, pode haver um atraso até a nova versão se tornar padrão.

  • Para tempos de execução de contêiner, a versão mínima necessária do Streamlit é 1.50. Você pode usar qualquer versão posterior do Streamlit, incluindo as streamlit-nightly.

    Importante

    As versões streamlit-nightly são experimentais. Para obter mais informações, consulte Nightly releases na documentação do Streamlit.

    Você pode usar imediatamente a versão mais recente do Streamlit instalando-a de um índice de pacotes.

  • Para tempos de execução de warehouse, você está limitado a um subconjunto de versões a partir da 1.22.0. As versões streamlit-nightly não são compatíveis.

    Não é possível usar imediatamente a versão mais recente do Streamlit em um tempo de execução de warehouse.

Para evitar atualizações inesperadas de pacotes, configure as dependências do seu app conforme descrito nesta página.

Versões compatíveis da biblioteca Streamlit em tempos de execução de warehouse

Streamlit in Snowflake suporta as seguintes versões da biblioteca de código aberto 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

Dependências não Python

Alguns pacotes Python exigem que bibliotecas do sistema não Python sejam instaladas no ambiente de tempo de execução. Por exemplo, o pacote Pillow requer bibliotecas para processar diferentes formatos de imagem.

  • Para dependências não Python em tempos de execução de contêiner, você só pode usar as bibliotecas do sistema pré-instaladas. A instalação de dependências não Python adicionais ainda não é compatível.

  • Para dependências não Python em tempos de execução de warehouse, algumas bibliotecas do sistema estão disponíveis no canal Snowflake Anaconda.

Práticas recomendadas para declarar dependências

Ao declarar as dependências do seu app, considere as seguintes práticas recomendadas:

  • Fixe as versões críticas do pacote.

    • Para tempos de execução de contêiner, use o operador == nos arquivos pyproject.toml ou requirements.txt.

    • Para tempos de execução de warehouse, use o operador = nos arquivos environment.yml.

  • Use intervalos de versões para flexibilidade.

    • Para tempos de execução de contêiner, use os operadores <, <=, >=, and > nos arquivos pyproject.toml ou requirements.txt.

    • Para tempos de execução de warehouse, use sufixos de curinga * nos arquivos environment.yml.

  • Mantenha as listas de dependências mínimas para reduzir o tempo de criação.

  • Teste as alterações de dependência em desenvolvimento antes da implantação.

  • Certifique-se de que suas dependências sejam compatíveis com a versão do Python em seu tempo de execução.

Ao migrar entre tempos de execução ou alterar seu gerenciador de pacotes, revise os nomes das dependências. Por exemplo, alguns pacotes têm nomes diferentes entre o Conda e o PyPI:

Pacote

Nome no Conda

Nome no PyPI

Pillow

pillow

Pillow

OpenCV

opencv

opencv-python

PyYAML

pyyaml

PyYAML

Gerenciamento de dependências para tempos de execução de contêiner

Os apps de tempo de execução de contêiner exigem uma integração de acesso externo (External Access Integration, EAI) para instalar pacotes de um índice de pacotes externo como PyPI. Sem uma EAI, você só pode usar pacotes enviados com o tempo de execução ou incluídos nos arquivos de origem do seu app.

Mesmo se você quiser especificar apenas a versão do Streamlit, deverá incluir uma EAI com o app. Sem uma EAI, se você tentar usar especificadores de versão em pacotes pré-instalados, poderá encontrar um erro quando a imagem base de tempo de execução for atualizada. Isso ocorre porque seu especificador de versão pode não ser mais compatível com os pacotes pré-instalados.

Integrações de acesso externo para tempos de execução de contêiner

Para uma visão geral das integrações de acesso externo (EAIs), consulte Visão geral do acesso à rede externa.

PyPI EAI

PyPI é o índice de pacotes padrão usado pelo uv para instalar pacotes Python em seu tempo de execução de contêiner. Para criar uma EAI para PyPI, você precisa de uma regra de rede que permita o acesso a todos os domínios PyPI necessários. Normalmente, as EAIs são criadas e mantidas pelo administrador da sua conta ou pela equipe de segurança.

Por exemplo, os comandos SQL a seguir criam uma EAI (pypi_access_integration) para o PyPI e concede USAGE a uma função de desenvolvimento de app (app_developer_role).

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

Depois de criar a EAI, você precisará adicioná-la ao seu objeto Streamlit. Você pode fazer isso no Snowsight ou com o SQL:

  1. Faça login no Snowsight.

  2. No menu de navegação, clique em Projects » Streamlit e selecione seu app.

  3. No canto superior direito, selecione Três pontos verticais indicando mais opções (mais opções) » App settings.

  4. Na caixa de diálogo App settings, selecione a guia External networks.

  5. Na lista de EAIs disponíveis, selecione o EAI para PyPI.

  6. Para salvar a alteração e fechar a caixa de diálogo, selecione Save.

Arquivos de dependência

Os tempos de execução de contêiner usam o uv para resolução de dependência rápida e confiável. O uv funciona como o pip para instalar pacotes Python, porém é mais eficiente e personalizável. Para obter mais informações sobre os recursos do uv, consulte a visão geral de recursos na documentação do uv.

Os tempos de execução de contêiner pesquisam arquivos de dependência no mesmo diretório que o arquivo de ponto de entrada do seu app. Se nenhum arquivo de dependência for encontrado, a pesquisa continuará subindo a árvore de diretórios até chegar à raiz do local de origem do seu app. O primeiro arquivo de dependência encontrado é usado para instalar as dependências do seu app.

Quando existem vários arquivos de dependência no mesmo diretório, eles são usados na seguinte ordem de precedência:

  • requirements.txt: lista os pacotes e as versões do Python necessários para seu app Streamlit, incluindo o próprio Streamlit. Você não pode configurar sua versão do Python com requirements.txt.

    Para obter mais informações sobre o formato do requirements.txt, consulte Requirements File Format na documentação do pip.

  • pyproject.toml (recomendado): gerencia sua versão e as dependências do Python. Atualmente, somente a versão 3.11 do Python é compatível. Quando você fornece um arquivo pyproject.toml, o uv gera um arquivo uv.lock para bloquear as versões de dependência. Esse arquivo de bloqueio será atualizado sempre que você atualizar as dependências. Você deverá usar o pyproject.toml se quiser usar um índice de pacotes diferente do PyPI.

    Para obter mais informações sobre o formato do pyproject.toml, consulte Writing your pyproject.toml na documentação do Python.

O requirements.txt é a maneira mais simples de declarar as dependências do seu app e é fornecido para facilitar os primeiros passos. Entretanto, para um gerenciamento de dependências mais avançado, a Snowflake recomenda o uso do pyproject.toml. Por exemplo, ele permite que você bloqueie as versões de dependência para garantir que suas compilações sejam reproduzíveis.

Dica

  • Você pode instalar um pacote de qualquer URL se tiver a EAI necessária atribuída ao seu app. Os URLs que exigem autenticação devem oferecer suporte a credenciais incorporadas.

  • Você pode instalar um pacote do diretório do seu projeto usando um caminho relativo do arquivo de dependência para um arquivo wheel.

  • Se você usar especificadores de versão em pacotes pré-instalados, deverá ter uma EAI para um índice de pacotes para evitar erros quando a imagem base de tempo de execução for atualizada.

Geralmente, seus arquivos de ponto de entrada e de dependência estão na raiz do diretório do seu projeto. Entretanto, o arquivo de ponto de entrada pode estar em um subdiretório e o arquivo de dependência pode estar no mesmo diretório ou em qualquer pai até a raiz do seu projeto.

Por exemplo, o diretório do seu projeto pode ter uma das seguintes estruturas:

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

Nota

O tempo de execução de contêiner usará o diretório que contém o arquivo de dependência como diretório de trabalho para o uv. Portanto, se você usar um caminho relativo para instalar um pacote dentre os arquivos de origem do app, o caminho deverá ser relativo ao local do arquivo de dependência. Para obter mais informações sobre a declaração de fontes de pacote, consulte Dependency sources na documentação do uv.

Exemplos de arquivos de dependência PyPI

O arquivo pyproject.toml deve incluir name e version para ter um formato válido para uv, mas os valores podem ser arbitrários. Use requires-python para definir a versão do Python, mesmo que os tempos de execução de contêiner sejam compatíveis apenas com o Python 3.11 por enquanto. Use dependencies para listar os pacotes Python para o tempo de execução de contêiner.

Dica

Instale o Streamlit como streamlit[snowflake] para incluir suas dependências do conector Snowflake (snowflake-snowpark-python).

Se você tem uma EAI para PyPI, o seguinte arquivo pyproject.toml declara a versão mínima do Python 3.11 e inclui cinco pacotes Python que serão instalados do 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"
]
Copy

Como alternativa ao pyproject.toml, você pode usar um arquivo requirements.txt para declarar as dependências do seu app. O seguinte requirements.txt contém os mesmos pacotes Python que o exemplo do pyproject.toml anterior:

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

Nota

Para fixar uma versão de um pacote, você deve usar o operador ==. Para especificar um intervalo de versões, você deve usar os operadores <, <=, >=, and >. Por exemplo, pandas>=2.0.0,<3.0.0 instala qualquer versão entre 2.0.0 e 2.99.99. Para obter mais informações, consulte Dependency specifiers.

Exemplos de arquivos de dependência JFrog

Para maior segurança, seu administrador de sistema pode exigir que você use um índice de pacotes selecionado ou privado, como o JFrog Artifactory. Esse é um recurso exclusivo para tempos de execução de contêiner. Com JFrog, você pode criar um índice de pacotes público ou privado que usa o PyPI como proxy ou hospeda pacotes personalizados. Dessa forma, você pode controlar quais pacotes e versões estão disponíveis para seus apps Streamlit.

Para especificar um índice de pacotes, você deve usar o pyproject.toml. Para obter mais informações, consulte Using alternative package indexes na documentação do uv.

O seguinte arquivo pyproject.toml declara a versão mínima do Python 3.11, inclui cinco pacotes Python e especifica o JFrog como índice de pacotes que usa o PyPI como proxy:

[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

Se o seu repositório JFrog requer autenticação, gere um token de acesso pessoal ou obtenha um token com escopo do administrador do sistema JFrog. Em seguida, inclua o token no URL. Não use sua senha do JFrog no URL. Neste caso, a tabela [[tool.uv.index]] no exemplo anterior será substituída pelo seguinte:

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

Gerenciamento de dependências para tempos de execução de warehouse

Os tempos de execução de warehouse usam o conda para gerenciar as dependências do seu app. Você pode declarar as dependências usando um arquivo environment.yml ou o seletor de pacotes integrado no Snowsight. As dependências são instaladas do canal Snowflake Anaconda, que inclui os pacotes Python e algumas bibliotecas do sistema não Python.

O canal Snowflake Anaconda contém mais versões do Streamlit do que as compatíveis com os tempos de execução de warehouse Streamlit in Snowflake. Para evitar problemas de compatibilidade, use apenas versões do Streamlit listadas em Versões compatíveis da biblioteca Streamlit em tempos de execução de warehouse. Caso contrário, você pode instalar qualquer outro pacote disponível no canal Snowflake Anaconda.

Arquivo environment.yml

Para instalar dependências em seu ambiente de tempo de execução de warehouse usando um arquivo environment.yml, crie ou edite o arquivo na raiz do local de origem do seu app. Se você não fornecer um arquivo environment.yml, o Snowflake usará apenas os pacotes pré-instalados para seu ambiente selecionado. Para obter mais informações sobre a estrutura do environment.yml, consulte a documentação do conda.

As seguintes limitações se aplicam ao usar arquivos environment.yml em tempos de execução de warehouse Streamlit in Snowflake:

O seguinte environment.yml declara o Python 3.11 e cinco pacotes 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

A Snowflake recomenda fixar uma versão do Streamlit para evitar que o aplicativo seja atualizado quando uma nova versão do Streamlit estiver disponível no Snowflake Anaconda Channel.

Nota

Para fixar uma versão de um pacote, você deve usar o operador =. Para especificar um intervalo de versões, você deve usar os curingas *. Por exemplo, pandas=2.* instala qualquer versão do pandas entre 2.0.0 e 2.99.99.

Desenvolvimento local com conda

Ao desenvolver seu app de tempo de execução de warehouse localmente com o conda, você deve incluir detalhes adicionais no arquivo environment.yml para garantir que as dependências sejam instaladas corretamente.

  • Identifique o canal Snowflake Anaconda por seu URL: https://repo.anaconda.com/pkgs/snowflake.

  • Bloqueie o canal padrão.

No arquivo environment.yml, use os dois canais a seguir:

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

Se defaults aparecer no arquivo ~/.condarc, comente-o:

channels:
  # - defaults
Copy

Seletor de pacotes do Snowsight

Além de editar o arquivo environment.yml diretamente para seu app de tempo de execução de warehouse, você pode usar o seletor de pacotes integrado no Snowsight para adicionar ou remover pacotes do ambiente do app. O seletor de pacotes só está disponível para apps que usam tempos de execução de warehouse. Além disso, o seletor de pacotes exibe apenas pacotes compatíveis com a versão atual do Python do seu app. Algumas bibliotecas do sistema independentes da versão do Python podem não ser mostradas no seletor de pacotes e devem ser adicionadas manualmente ao environment.yml.

  1. Faça login no Snowsight.

  2. No menu de navegação, clique em Projects » Streamlit e selecione seu app Streamlit.

  3. No canto superior direito, selecione Edit.

  4. No canto superior esquerdo do painel do editor, selecione Packages.

    Um painel suspenso é exibido com a guia Anaconda Packages selecionada.

  5. Execute qualquer uma das seguintes ações:

  • Para definir a versão do Python, no seletor de Python version, escolha a versão desejada.

  • Para adicionar um pacote, use a barra de pesquisa para encontrar pacotes por nome e selecione o pacote desejado.

  • Para remover um pacote, na seção Installed Packages, selecione o ícone x à direita da versão do pacote.

  • Para definir a versão de um pacote instalado, na seção Installed Packages, use o seletor de versões ao lado do nome do pacote.

O Snowflake atualiza o arquivo environment.yml automaticamente e reinicia seu app. Se você o arquivo environment.yml estiver aberto no editor, atualize a página para ver as alterações.