Migra al entorno de ejecución de Python 3

Python 2.7 alcanzó el fin de la asistencia el 31 de enero de 2024. Tus aplicaciones existentes de Python 2.7 seguirán ejecutándose y recibiendo tráfico. Sin embargo, App Engine podría bloquear la reimplementación de aplicaciones que usan entornos de ejecución después de su fecha de finalización. Te recomendamos que migres a la versión más reciente compatible de Python mediante los lineamientos de esta página.

Migrar al entorno de ejecución de Python 3 te permite usar funciones de lenguaje actualizadas y compilar apps que son más portátiles, con código idiomático. El entorno de ejecución de Python 3 usa la última versión del intérprete de código abierto de Python que proporciona Python Software Foundation. Las apps compiladas en el entorno de ejecución de Python 3 pueden usar el amplio ecosistema de paquetes y frameworks de Python en tu app, incluidos los que usan código C, mediante la declaración de dependencias en un archivo requirements.txt.

Descripción general del proceso de migración del entorno de ejecución

Recomendamos el siguiente enfoque incremental para la migración en entorno de ejecución, en el que mantienes una aplicación en funcionamiento y que se puede probar durante todo el proceso:

  1. Actualiza tu app para que sea compatible con Python 3.

    Hay varias soluciones disponibles para ayudarte con esta actualización. Por ejemplo, usa Six, Python-Future o Python-Modernize.

    Para obtener más información sobre este paso del proceso de migración, consulta Transferencia del código de Python 2 a Python 3 en el sitio de documentación de Python Software Foundation.

  2. Elige una de estas estrategias de implementación para cualquier servicio en paquetes de App Engine que use tu app:

    1. Migra los servicios heredados agrupados en paquetes en tu app de Python 2 a los servicios desagrupados de Google Cloud, servicios de terceros u otras alternativas recomendadas.

    2. Sigue usando servicios agrupados en paquetes heredados en tus apps de Python 3. Este enfoque te brinda la flexibilidad para pasar a los servicios sin agrupar más adelante en el ciclo de migración.

    Asegúrate de probar tu app después de migrar cada servicio.

  3. Prepara los archivos de configuración de App Engine para el entorno de ejecución de Python 3. Varios cambios importantes afectan la configuración en app.yaml, incluidos algunos de los siguientes:

    • Ahora se supone que las aplicaciones son seguras para usar en subprocesos. Si tu aplicación no es segura para los subprocesos, debes establecer max_concurrent_requests en tu app.yaml en 1. Esta configuración puede generar más instancias de las que necesitas en una app segura para los subprocesos, lo que puede generar costos innecesarios.
    • El archivo app.yaml ya no enruta solicitudes a tus secuencias de comandos. En su lugar, se te pedirá que uses un framework web con enrutamiento integrado en la app y actualices o quites todos los controladores script en app.yaml. Para ver un ejemplo de cómo hacer esto con el framework de Flask, consulta la muestra de código de la guía de migración de App Engine en GitHub.

      Si quieres obtener más información para cambiar este y otros archivos de configuración, consulta la sección Archivos de configuración.

  4. En los entornos de ejecución de segunda generación, los registros de la app ya no están anidados dentro de los registros de solicitud. Se necesitan pasos adicionales para mostrar la vista anidada de los registros de la solicitud y la app en el Explorador de registros. Para obtener más información, consulta Migra a Cloud Logging.

  5. Prueba y, luego, implementa tu app actualizada en un entorno de Python 3.

    Después de pasar todas las pruebas, implementa la aplicación actualizada en App Engine, pero evita que el tráfico se enrute automáticamente a la nueva versión. Usa la división del tráfico para migrar lentamente el tráfico de tu app en el entorno de ejecución de Python 2 a la app en el entorno de ejecución de Python 3. Si tienes problemas, puedes enrutar todo el tráfico a una versión estable hasta que se solucione el problema.

Para ver ejemplos de cómo convertir tus apps de Python 2 en Python 3, puedes consultar estos recursos adicionales.

Diferencias fundamentales entre los entornos de ejecución de Python 2 y Python 3

La mayoría de los cambios que debes realizar durante la migración en entorno de ejecución provienen de las diferencias siguientes entre los entornos de ejecución de Python 2 y Python 3:

Diferencias en el uso de memoria

Los entornos de ejecución de segunda generación ven un modelo de referencia de uso de memoria más alto en comparación con los entornos de ejecución de primera generación. Esto se debe a varios factores, como las diferentes versiones de imagen base, y las diferencias en la forma en que las dos generaciones calculan el uso de memoria.

Los entornos de ejecución de segunda generación calculan el uso de memoria de las instancias como la suma de lo que usa un proceso de la aplicación y la cantidad de archivos de la aplicación almacenados en caché de forma dinámica en la memoria. Para evitar que las aplicaciones con uso intensivo de memoria experimenten apagados de instancias debido a que se excedieron los límites de memoria, actualiza a una clase de instancia más grande con más memoria.

Diferencias en el uso de CPU

Los entornos de ejecución de segunda generación pueden ver un modelo de referencia de uso de CPU más alto cuando se inicia en frío en la instancia. Según la configuración de escalamiento de una aplicación, esto puede tener efectos secundarios no deseados, como un recuento de instancias más alto de lo previsto si una aplicación está configurada para escalar en función del uso de CPU. Para evitar este problema, revisa y prueba las configuraciones de escalamiento de la aplicación para asegurarte de que la cantidad de instancias sea aceptable.

Diferencias en el encabezado de la solicitud

Los entornos de ejecución de primera generación permiten que los encabezados de la solicitud con guiones bajos (p.ej., X-Test-Foo_bar) se reenvíen a la aplicación. Los entornos de ejecución de segunda generación ingresan Nginx en la arquitectura del host. Como resultado de este cambio, los entornos de ejecución de segunda generación están configurados para quitar de forma automática los encabezados con guiones bajos (_). Para evitar problemas con la aplicación, evita usar guiones bajos en los encabezados de la solicitud de la aplicación.

Diferencias entre los trabajadores de Gunicorn

Para los entornos de ejecución de Python 3+, la cantidad de trabajadores de Gunicorn tiene un impacto directo en el uso de memoria. El aumento del uso de memoria es directamente proporcional al aumento en el conteo de trabajadores. Para reducir el consumo de memoria, considera reducir la cantidad de trabajadores de Gunicorn. Consulta las Prácticas recomendadas sobre puntos de entrada para obtener instrucciones sobre cómo configurar el recuento de trabajadores de Gunicorn.

Problemas de compatibilidad entre Python 2 y Python 3

Cuando Python 3 se lanzó por primera vez en 2008, se implementaron varios cambios incompatibles con versiones anteriores en el lenguaje. Algunos de estos cambios solo requieren actualizaciones menores en tu código, como cambiar la declaración print a una función print(). Otros cambios pueden requerir actualizaciones significativas en tu código, como actualizar la forma en que manejas los datos binarios, el texto y las strings.

Muchas bibliotecas populares de código abierto, incluidas las bibliotecas estándar de Python, también se modificaron cuando se migraron de Python 2 a Python 3.

Servicios de App Engine agrupados en paquetes en el entorno de ejecución de Python 3

Para reducir el esfuerzo y la complejidad de la migración, el entorno estándar de App Engine te permite acceder a muchos servicios agrupados en paquetes y API heredados en el entorno de ejecución de Python 3, como Memcache. Tu app de Python 3 puede llamar a las API de servicios agrupadas a través de bibliotecas idiomáticas de lenguaje y acceder a la misma funcionalidad que en el entorno de ejecución de Python 2.

También tienes la opción de usar productos de Google Cloud que ofrecen funciones similares a las de los servicios agrupados en paquetes heredados. Te recomendamos que migres a los productos de Google Cloud sin agrupar, ya que te permite aprovechar las mejoras continuas y las funciones nuevas.

Para los servicios agrupados en paquetes que no están disponibles como productos separados en Google Cloud, como el procesamiento de imágenes, la búsqueda y la mensajería, puedes usar nuestros proveedores de terceros sugeridos u otras soluciones alternativas.

Archivos de configuración

Antes de que puedas ejecutar tu app en el entorno de ejecución de Python 3 del entorno estándar de App Engine, es posible que debas cambiar algunos de los archivos de configuración que usa App Engine:

Framework web necesario para enrutar solicitudes de contenido dinámico

En el entorno de ejecución de Python 2, puedes crear controladores de URL en el archivo app.yaml para especificar qué aplicación ejecutar cuando se solicita un patrón de URL o una URL específica.

En el entorno de ejecución de Python 3, tu app necesita usar un framework web como Flask o Django para enrutar solicitudes de contenido dinámico, en lugar de usar controladores de URL en app.yaml. En el caso del contenido estático, puedes seguir creando controladores de URL en el archivo app.yaml de tu app.

Aplicaciones con contenido estático únicamente

Cuando alojes una aplicación web estática en App Engine, debes especificar controladores en tu archivo app.yaml para mapear las URL a tus archivos estáticos.

En Python 2, si una solicitud no coincide con ninguno de los controladores especificados en el archivo app.yaml, App Engine muestra un código de error 404.

En Python 3, si una solicitud no coincide con ninguno de los controladores, App Engine busca un archivo main.py y muestra un error 5xx si no se encuentra un archivo main.py. Debido a que las aplicaciones de App Engine solo con contenido estático no requieren un archivo main.py, la mayoría de los usuarios ven este error, además de ver los errores de inicio de la instancia en los registros de la aplicación.

Para mantener el mismo comportamiento de mostrar un error 404 cuando ninguno de los controladores estáticos coincide y evitar errores en los registros, puedes hacer lo siguiente:

  • Agrega un controlador estático general que apunte a un directorio vacío en el archivo app.yaml.
  • Agrega una app dinámica simple en el archivo main.py para mostrar un error 404.

Ejemplos de uso de cualquiera de las opciones:

app.yaml

Crea un directorio vacío en el directorio raíz de la app, como empty/. En la sección del controlador app.yaml, crea un controlador nuevo al final para detectar todos los demás patrones de URL y especifica el directorio empty en elementos static_files y upload:

  handlers:
  - url:
    .
    .
    .
  - url: /(.*)$
    static_files: empty/\1
    upload: empty/.*$

main.py

Crea un archivo main.py y agrega el siguiente código para mostrar un error 404:

  def app(env, start_response):
    start_response('404 Not Found', [('Content-Type','text/html')])
    return [b"Not Found"]

Prueba

Te recomendamos que uses un enfoque de prueba que sea idiomático para Python en lugar de depender de dev_appserver. Por ejemplo, puedes usar venv para crear un entorno local aislado de Python 3. Se puede usar cualquier framework de prueba estándar de Python para escribir tu unidad, integración y pruebas del sistema. Quizás también consideres la configuración de versiones de desarrollo de tus servicios o el uso de los emuladores locales disponibles para muchos productos de Google Cloud.

De manera opcional, puedes usar la versión de vista previa de dev_appserver compatible con Python 3. Para obtener más información sobre esta función de prueba, consulta Usa el servidor de desarrollo local.

Implementando

Las implementaciones a través de appcfg.py no son compatibles con Python 3. En su lugar, usa la herramienta de línea de comandos de gcloud para implementar tu app.

Logging

El registro en el entorno de ejecución de Python 3 sigue el estándar de registro de Cloud Logging. En el entorno de ejecución de Python 3, los registros de la app ya no se agrupan en paquetes con los registros de solicitud, sino que están separados en registros diferentes. Para obtener más información sobre cómo leer y escribir registros en el entorno de ejecución de Python 3, consulta la guía de registro.

Recursos de migración adicionales

Para obtener información adicional sobre cómo migrar tus apps de App Engine a servicios independientes de Cloud o al entorno de ejecución de Python 3, puedes consultar estos recursos de App Engine: