Especifique dependências em Python

Existem duas formas de especificar dependências para funções do Cloud Run escritas em Python: usar o ficheiro requirements.txt do gestor de pacotes pip ou criar pacotes de dependências locais juntamente com a sua função.

A especificação de dependências através da norma Pipfile/Pipfile.lock não é suportada. O seu projeto não deve incluir estes ficheiros.

O Functions Framework é uma dependência obrigatória para todas as funções. Embora o Cloud Run o instale em seu nome quando a função é criada, recomendamos que o inclua como uma dependência explícita.

Especifique dependências com o pip

As dependências em Python são geridas com o pip e expressas num ficheiro de metadados denominado requirements.txt. Este ficheiro tem de estar no mesmo diretório que o ficheiro main.py que contém o seu código de função.

Quando implementa ou reimplementa a sua função, o Cloud Run usa o pip para transferir e instalar a versão mais recente das suas dependências, conforme declarado no ficheiro requirements.txt. O ficheiro requirements.txt contém uma linha por pacote. Cada linha contém o nome do pacote e, opcionalmente, a versão pedida. Para mais detalhes, consulte a referência requirements.txt.

Para evitar que a compilação seja afetada por alterações à versão das dependências, considere fixar os pacotes de dependências a uma versão específica.

Segue-se um exemplo de um ficheiro requirements.txt:

functions-framework
requests==2.20.0
numpy

Empacote dependências locais

Também pode criar pacotes e implementar dependências juntamente com a sua função. Esta abordagem é útil se a sua dependência não estiver disponível através do gestor de pacotes pip ou se o acesso à Internet do seu ambiente do Cloud Run estiver restrito.

Por exemplo, pode usar uma estrutura de diretórios como a seguinte:

myfunction/
├── main.py
└── localpackage/
    ├── __init__.py
    └── script.py

Em seguida, pode importar o código como habitualmente a partir de localpackage usando a seguinte declaração import.

# Code in main.py
from localpackage import script

Tenha em atenção que esta abordagem não executa ficheiros setup.py. Os pacotes com esses ficheiros podem continuar a ser agrupados, mas podem não ser executados corretamente nas funções do Cloud Run.

Dependências copiadas

As dependências copiadas são dependências cuja origem está incluída diretamente no pacote de código-fonte e são recompiladas juntamente com o seu próprio código. Use a variável de ambiente de compilação GOOGLE_VENDOR_PIP_DEPENDENCIES para criar dependências pip copiadas e evitar instalá-las durante a implementação.

Crie dependências copiadas

  1. Certifique-se de que o python3 está instalado no seu sistema de desenvolvimento.

  2. Declare as dependências da sua aplicação num ficheiro requirements.txt no diretório raiz da sua árvore de desenvolvimento.

  3. Declare o Functions Framework como um requisito incluindo functions-framework numa linha separada no ficheiro requirements.txt.

  4. Transfira as dependências da sua função para o diretório local. Os passos para o fazer dependem de a dependência ser um ficheiro Python wheel (*.whl) ou um ficheiro tar (*.tar.gz).

    1. Se a dependência for um wheel do Python (*.whl), transfira-o para o diretório raiz da sua estrutura de desenvolvimento com este comando pip:

      python3 -m pip download -r requirements.txt --only-binary=:all: \
         -d DIRECTORY \
         --python-version PYTHON_RUNTIME_VERSION \
         --platform manylinux2014_x86_64 \
         --implementation cp
      

      Substituir:

      • DIRECTORY: o nome do diretório local para o qual transferir.
      • PYTHON_RUNTIME_VERSION: a versão do Python a usar para verificações de compatibilidade. Por exemplo, 311 para Python 3.11.
        Esta versão tem de corresponder a um dos tempos de execução do Python suportados.

      A estrutura de diretórios resultante deve ter o seguinte aspeto:

      myfunction/
      ├── main.py
      └── requirements.txt
      └── DIRECTORY
         ├── dependency1.whl
         └── dependency2.whl
      
    2. Se a dependência for um ficheiro TAR (*.tar.gz):

      1. Se a dependência estiver escrita em Python, use o pip para a transferir:

        python3 -m pip download -r requirements.txt \
           -d DIRECTORY
        
      2. Se uma dependência consistir em código escrito em C ou C++, tem de a transferir e compilar separadamente.

  5. Implemente a função e as respetivas dependências copiadas:

    gcloud functions deploy FUNCTION_NAME \
      --runtime PYTHON_RUNTIME_NAME \
      --set-build-env-vars GOOGLE_VENDOR_PIP_DEPENDENCIES=DIRECTORY
    

    Substituir:

    • FUNCTION_NAME: o nome da função que está a implementar.
    • PYTHON_RUNTIME_NAME: o nome de um dos tempos de execução do Python suportados para executar a função implementada, por exemplo, python311. Tem de ser a mesma versão de tempo de execução do Python que usou no seu ambiente de desenvolvimento local.
    • DIRECTORY: o nome do diretório que contém as suas dependências copiadas.

Para ver mais detalhes sobre a utilização de buildpacks, consulte o artigo Crie uma função com buildpacks.

Use dependências privadas

Pode usar dependências privadas do Artifact Registry ou de outros repositórios.

Dependências privadas do Artifact Registry

Um repositório do Python do Artifact Registry pode alojar dependências privadas para a sua função do Python. Quando implementar no Cloud Run, o processo de compilação gera automaticamente credenciais do Artifact Registry para a conta de serviço do Cloud Build. Só tem de incluir o URL do Artifact Registry no seu requirements.txt sem gerar credenciais adicionais. Por exemplo:

--index-url REPOSITORY_URL
sampleapp
Flask==0.10.1
google-cloud-storage

Se a sua compilação precisar de vários repositórios, use um repositório virtual do Artifact Registry para controlar com segurança a ordem em que o pip pesquisa os seus repositórios.

Dependências privadas de outros repositórios

As dependências são instaladas num ambiente do Cloud Build que não fornece acesso a chaves SSH. Os pacotes alojados em repositórios que requerem autenticação baseada em SSH têm de ser copiados e carregados juntamente com o código do seu projeto, conforme descrito na secção anterior.

Pode usar o comando pip install com o sinalizador -t DIRECTORY para copiar dependências privadas para um diretório local antes de implementar a sua app, da seguinte forma:

  1. Copie a dependência para um diretório local:

    pip install -t DIRECTORY DEPENDENCY
  2. Adicione um ficheiro __init__.py vazio ao diretório DIRECTORY para o transformar num módulo.

  3. Importe deste módulo para usar a sua dependência:

    import DIRECTORY.DEPENDENCY

Pacotes pré-instalados

Os seguintes pacotes Python são instalados automaticamente juntamente com a sua função durante a implementação. Se estiver a usar algum destes pacotes no código da função, recomendamos que inclua as seguintes versões no ficheiro requirements.txt:

Python 3.8 e posteriores

anyio==4.5.2
blinker==1.8.2
click==8.1.8
cloudevents==1.11.0
deprecation==2.1.0
exceptiongroup==1.3.0
Flask==3.0.3
functions-framework==3.9.1
gunicorn==23.0.0
h11==0.16.0
idna==3.10
importlib_metadata==8.5.0
itsdangerous==2.2.0
Jinja2==3.1.6
MarkupSafe==2.1.5
packaging==25.0
sniffio==1.3.1
starlette==0.44.0
typing_extensions==4.13.2
uvicorn==0.33.0
uvicorn-worker==0.2.0
watchdog==4.0.2
Werkzeug==3.0.6
zipp==3.20.2

Python 3.7

aiohttp==3.8.1
aiosignal==1.2.0
async-timeout==4.0.2
attrs==21.4.0
cachetools==4.2.4
certifi==2021.10.8
chardet==4.0.0
charset-normalizer==2.0.10
click==8.0.3
Flask==2.0.2
frozenlist==1.2.0
google-api-core==2.3.2
google-api-python-client==2.34.0
google-auth==2.3.3
google-auth-httplib2==0.1.0
google-cloud-core==2.2.1
google-cloud-trace==1.5.1
googleapis-common-protos==1.54.0
grpcio==1.43.0
grpcio-status==1.43.0
httplib2==0.20.2
idna==3.3
itsdangerous==2.0.1
Jinja2==3.1.6
MarkupSafe==2.0.1
multidict==5.2.0
opencensus==0.8.0
opencensus-context==0.1.2
packaging==21.3
proto-plus==1.19.8
protobuf==3.19.1
pyasn1==0.4.8
pyasn1-modules==0.2.8
pyparsing==3.0.6
pytz==2021.3
PyYAML==6.0
requests==2.27.1
rsa==4.8
setuptools==60.3.1
six==1.16.0
uritemplate==4.1.1
urllib3==1.26.7
Werkzeug==2.0.2
wrapt==1.13.3
yarl==1.7.2

* `pip` (latest version)
* `setuptools` (latest version)
* `wheel` (determined by product requirements)

Além disso, o tempo de execução do Python inclui vários pacotes do sistema no ambiente de execução.