Especificar dependencias en Python

Hay dos formas de especificar las dependencias de las funciones de Cloud Run escritas en Python: usar el archivo requirements.txt del gestor de paquetes pip o empaquetar las dependencias locales junto con la función.

No se admite la especificación de dependencias mediante el estándar Pipfile/Pipfile.lock. Tu proyecto no debe incluir estos archivos.

El Functions Framework es una dependencia obligatoria para todas las funciones. Aunque Cloud Run lo instala en tu nombre cuando se crea la función, te recomendamos que lo incluyas como dependencia explícita.

Especificar dependencias con pip

Las dependencias de Python se gestionan con pip y se expresan en un archivo de metadatos llamado requirements.txt. Este archivo debe estar en el mismo directorio que el archivo main.py que contiene el código de la función.

Cuando despliegas o vuelves a desplegar tu función, Cloud Run usa pip para descargar e instalar la versión más reciente de tus dependencias, tal como se declara en el archivo requirements.txt. El archivo requirements.txt contiene una línea por paquete. Cada línea contiene el nombre del paquete y, opcionalmente, la versión solicitada. Para obtener más información, consulta la referencia de requirements.txt.

Para evitar que la compilación se vea afectada por los cambios en la versión de las dependencias, te recomendamos que fijes los paquetes de dependencias a una versión específica.

A continuación, se muestra un ejemplo de archivo requirements.txt:

functions-framework
requests==2.20.0
numpy

Empaquetar dependencias locales

También puedes empaquetar e implementar dependencias junto con tu función. Este enfoque es útil si tu dependencia no está disponible mediante el gestor de paquetes pip o si el acceso a Internet de tu entorno de Cloud Run está restringido.

Por ejemplo, puedes usar una estructura de directorios como la siguiente:

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

A continuación, puedes importar el código como de costumbre desde localpackage con la siguiente instrucción import.

# Code in main.py
from localpackage import script

Ten en cuenta que este método no ejecutará ningún archivo setup.py. Los paquetes con esos archivos se pueden seguir empaquetando, pero es posible que no se ejecuten correctamente en las funciones de Cloud Run.

Dependencias copiadas

Las dependencias copiadas son dependencias cuyo origen se incluye directamente en tu paquete de código fuente y se vuelven a compilar junto con tu código. Usa la variable de entorno de compilación GOOGLE_VENDOR_PIP_DEPENDENCIES para crear copias de las dependencias de pip y evitar instalarlas durante la implementación.

Crear dependencias copiadas

  1. Asegúrate de que python3 esté instalado en tu sistema de desarrollo.

  2. Declara las dependencias de tu aplicación en un archivo requirements.txt del directorio raíz de tu árbol de desarrollo.

  3. Declara Functions Framework como requisito incluyendo functions-framework en una línea independiente de tu archivo requirements.txt.

  4. Descarga las dependencias de tu función en tu directorio local. Los pasos para hacerlo dependen de si la dependencia es un archivo de rueda de Python (*.whl) o un archivo tar (*.tar.gz).

    1. Si la dependencia es un wheel de Python (*.whl), descárgala en el directorio raíz de tu árbol de desarrollo con 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
      

      Sustituye:

      • DIRECTORY: nombre del directorio local en el que se descargará.
      • PYTHON_RUNTIME_VERSION: la versión de Python que se va a usar para las comprobaciones de compatibilidad. Por ejemplo, 311 para Python 3.11.
        Esta versión debe coincidir con uno de los runtimes de Python compatibles.

      La estructura de directorios resultante debería ser similar a esta:

      myfunction/
      ├── main.py
      └── requirements.txt
      └── DIRECTORY
         ├── dependency1.whl
         └── dependency2.whl
      
    2. Si la dependencia es un archivo tar (*.tar.gz):

      1. Si la dependencia está escrita en Python, usa pip para descargarla:

        python3 -m pip download -r requirements.txt \
           -d DIRECTORY
        
      2. Si una dependencia consta de código escrito en C o C++, debes descargarla y compilarla por separado.

  5. Despliega tu función y sus dependencias copiadas:

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

    Sustituye:

    • FUNCTION_NAME: el nombre de la función que vas a implementar.
    • PYTHON_RUNTIME_NAME: el nombre de uno de los runtimes de Python admitidos para ejecutar la función implementada (por ejemplo, python311). Debe ser la misma versión del tiempo de ejecución de Python que hayas usado en tu entorno de desarrollo local.
    • DIRECTORY: el nombre del directorio que contiene las dependencias copiadas.

Para obtener más información sobre cómo usar paquetes de compilación, consulta Compilar una función con paquetes de compilación.

Usar dependencias privadas

Puedes usar dependencias privadas de Artifact Registry o de otros repositorios.

Dependencias privadas de Artifact Registry

Un repositorio de Python de Artifact Registry puede alojar dependencias privadas de tu función de Python. Cuando se despliega en Cloud Run, el proceso de compilación genera automáticamente credenciales de Artifact Registry para la cuenta de servicio de Cloud Build. Solo tiene que incluir la URL de Artifact Registry en su requirements.txt sin generar credenciales adicionales. Por ejemplo:

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

Si tu compilación necesita varios repositorios, usa un repositorio virtual de Artifact Registry para controlar de forma segura el orden en el que pip busca en tus repositorios.

Dependencias privadas de otros repositorios

Las dependencias se instalan en un entorno de Cloud Build que no proporciona acceso a las claves SSH. Los paquetes alojados en repositorios que requieran autenticación basada en SSH deben copiarse y subirse junto con el código de tu proyecto, tal como se describe en la sección anterior.

Puedes usar el comando pip install con la marca -t DIRECTORY para copiar las dependencias privadas en un directorio local antes de implementar tu aplicación, como se indica a continuación:

  1. Copia la dependencia en un directorio local:

    pip install -t DIRECTORY DEPENDENCY
  2. Añade un archivo __init__.py vacío al directorio DIRECTORY para convertirlo en un módulo.

  3. Importa desde este módulo para usar tu dependencia:

    import DIRECTORY.DEPENDENCY

Paquetes preinstalados

Los siguientes paquetes de Python se instalan automáticamente junto con tu función durante la implementación. Si usas alguno de estos paquetes en el código de tu función, te recomendamos que incluyas las siguientes versiones en tu archivo requirements.txt:

Python 3.8 y versiones 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)

Además, el tiempo de ejecución de Python incluye varios paquetes del sistema en el entorno de ejecución.