Noções básicas sobre as diferenças entre o Python 2 e o Python 3 no ambiente padrão do App Engine

O ambiente de execução do Python 3 no ambiente padrão do App Engine é um ambiente de execução de segunda geração. O uso de uma nova tecnologia de sandbox permite que esse ambiente de execução dê suporte a uma experiência de desenvolvimento Python totalmente idiomática.

Experiência idiomática de desenvolvimento em Python

O ambiente de execução do Python 3 é desenvolvido com base em três ideias principais:

  • Seu app usa a versão mais recente do interpretador de código aberto do Python, fornecido pela Python Software Foundation.
  • O rico ecossistema de pacotes e estruturas do Python, incluindo aqueles que usam o código C, pode ser implantado junto com seu app usando um arquivo requirements.txt.
  • Você não precisa de conhecimento específico nem especializado em plataforma para desenvolver no App Engine.

O objetivo é que o aplicativo seja totalmente portátil e que possa ser executado em qualquer ambiente padrão do Python. Você escreve um app Python padrão, não um app Python do App Engine. Como parte dessa mudança, você não precisa mais usar APIs e serviços proprietários do App Engine para a funcionalidade principal do app. No momento, as APIs do Google App Engine não estão disponíveis no ambiente de execução do Python 3.7.

Como migrar entre o Python 2 e o Python 3 no ambiente padrão do App Engine

O ambiente de execução do Python 3, no ambiente padrão do App Engine, é bastante diferente do ambiente de execução do Python 2. Ns seções a seguir, há mais detalhes sobre as diferenças entre os ambientes de execução do Python 2 e do Python 3, bem como recomendações sobre como abordar essas diferenças ao projetar seu aplicativo.

Se você decidir migrar seu aplicativo do Python 2 para o Python 3 no ambiente padrão do App Engine, esteja ciente das seguintes diferenças:

Compartilharemos atualizações adicionais do caminho de migração à medida que essas atualizações forem sendo disponibilizadas.

Problemas de compatibilidade entre o Python 2 e o Python 3

Quando o Python 3 foi anunciado pela primeira vez, em 2009, várias alterações incompatíveis com versões anteriores foram introduzidas à linguagem. Essas mudanças variam de facilmente gerenciáveis como, por exemplo, a função print se tornando uma função print(), para mais complexas como o gerenciamento de texto, string e dados binários. Além disso, muitas bibliotecas de código aberto conhecidas, incluindo as bibliotecas padrão do Python, sofreram alterações à medida que foram movidas do Python 2 para o Python 3.

Existem inúmeros guias on-line que podem ajudá-lo a lidar com essas mudanças. Algumas ferramentas podem ajudá-lo a gerenciar traduções de código automáticas do Python 2 para o Python 3. A comunidade Python forneceu muitos recursos para ajudar a lidar com essas mudanças. Eles não são, portanto, abordados em detalhes neste documento.

Menos restrições no ambiente de execução

O ambiente de execução do Python 3 tem menos restrições que o ambiente de execução do Python 2. Agora é possível instalar dependências arbitrárias de terceiros, acessar o sistema de arquivos, gerar threads em segundo plano e usar as bibliotecas de cliente do Google Cloud.

Dependências de terceiros e código nativo

É possível instalar dependências arbitrárias de terceiros, incluindo as que usam código nativo. O App Engine instalará as dependências listadas no arquivo de metadados requirements.txt usando o comando pip install.

Acesso ao sistema de arquivos

Arquivos podem ser gravados temporariamente em /tmp. Observe que os arquivos gravados em /tmp podem não estar disponíveis nas solicitações subsequentes ao aplicativo.

Threads em segundo plano

O Python 3, no ambiente padrão do Google App Engine, não tem limitações de sandbox, portanto, você tem liberdade para criar threads ou processos que residam fora do ambiente de solicitação. Podem ser gerados threads e processos com o uso dos recursos integrados de encadeamento e de multiprocessamento do Python. No entanto, observe que novos threads ou processos podem não ser executados após a entrega da solicitação de entrada.

Bibliotecas de cliente do Cloud

As bibliotecas google-cloud-python são compatíveis com esse ambiente de execução. É possível usar essas bibliotecas para acessar os serviços do Google Cloud Platform, como o Cloud Pub/Sub, o Cloud Datastore, o Cloud Spanner e outros. Veja a lista completa de produtos compatíveis no arquivo README do repositório.

Alterações no ambiente padrão do App Engine

O ambiente de execução do Python 3.7, no ambiente padrão do App Engine, não usa o SDK do App Engine para fornecer acesso à funcionalidade do serviço, diferentemente do que ocorre com ambiente de execução do Python 2.7. Em vez disso, ao usar o ambiente de execução do Python 3.7, você precisa usar os serviços gerenciados do Google Cloud e/ou serviços de terceiros que atendam às suas necessidades.

Alterações nesta seção referem-se apenas ao Python 3.7. O ambiente de execução do Python 2.7 permanece inalterado.

app.yaml

O comportamento de alguns campos no seu arquivo de configuração app.yaml foi modificado.

CampoTipo de alteraçãoDescrição
entrypointIncluídoAdotado a partir do ambiente flexível do App Engine. Como alternativa, é possível usar esse campo para especificar o comando que será executado quando o aplicativo for iniciado.
threadsafeObsoletoTodas os aplicativos são presumidos como threadsafe.
api_versionObsoletoNão é mais usado no ambiente de execução do Python 3.
builtinsObsoleto
librariesObsoletoDependências arbitrárias de terceiros podem ser instaladas usando um arquivo de metadados requirements.txt.
handlersModificado
  • O campo script é opcional e o único valor aceito é auto. Use uma biblioteca da Web (por exemplo, Flask ou Django) com roteamento no aplicativo para executar um script quando uma solicitação atingir uma rota específica
  • O campo login não é compatível. Use o Gerenciamento de identidade e acesso do Cloud para gerenciar usuários.

O uso de qualquer um dos campos obsoletos retornará um erro quando você implantar seu aplicativo.

Implantação

Implantações via appcfg.py não são compatíveis com o Python 3.7. Use a ferramenta de linha de comando gcloud para implantar seu aplicativo.

APIs do App Engine

As APIs proprietárias do App Engine não estão disponíveis no Python 3. Esta seção lista as substituições recomendadas.

Blobstore

Para armazenar e recuperar dados, use o Cloud Storage por meio de bibliotecas de cliente do Google Cloud. Para começar, consulte Usar o Cloud Storage.

Datastore

Como alternativa a um banco de dados de chave/valor NoSQL, como a API Datastore, use o Cloud Firestore. Ao criar um novo banco de dados do Cloud Firestore, é possível configurar a instância do banco de dados para ser executada no modo Cloud Datastore, o que torna o banco de dados compatível com versões anteriores do Cloud Datastore.

Para mais informações, consulte Escolher entre o modo nativo e o modo Datastore.

Imagens

Para manipular e processar imagens, recomendamos a Imgix. Como alternativa, use a Rethumb (ambos em inglês) se você preferir ter um nível gratuito.

Para armazenar e veicular suas imagens, consulte Como usar o Cloud Storage ou Como veicular arquivos estáticos.

Geração de registros

Os registros de solicitações não são mais correlacionados automaticamente, mas continuarão sendo exibidos no Stackdriver Logging. Use as bibliotecas de cliente do Stackdriver Logging para implementar o comportamento de geração registro de sua escolha.

E-mail

Para enviar e-mails, use um provedor de email terceirizado, como SendGrid, Mailgun ou Mailjet (todos em inglês). Todos esses serviços oferecem APIs para enviar e-mails a partir de aplicativos.

Memcache

Para gerar um cache de aplicativo, crie uma instância do Cloud Memorystore e conecte-a ao aplicativo usando o acesso VPC sem servidor.

Módulos

Use uma combinação de variáveis de ambiente e a API Admin do App Engine para receber informações e modificar os serviços em execução do aplicativo:

Informações de serviços Como acessar
Nome do serviço atual Por meio da variável de ambiente GAE_SERVICE.
Versão do serviço atual Por meio da variável de ambiente GAE_VERSION.
Código da instância atual Por meio da variável de ambiente GAE_INSTANCE.
Nome do host padrão Método apps.get da API Admin
Lista de serviços Método apps.services.list da API Admin
Lista de versões de um serviço Método apps.services.versions.list da API Admin
Versão padrão de um serviço, incluindo qualquer divisão de tráfego Método apps.services.get da API Admin
Lista de instâncias em execução de uma versão Método apps.services.versions.instances.list da API Admin

Hospede qualquer banco de dados de pesquisa de texto completo, como o ElasticSearch no Compute Engine, e acesse-o a partir do serviço.

Fila de tarefas

Coloque na fila tarefas de execução assíncrona de código por meio da API REST do Cloud Tasks, da API RPC ou da biblioteca de cliente do Google Cloud, além disso, use um serviço padrão do App Engine para Python 3.7 como um destino Push. Para mais informações, consulte Migrar do Task Queues para o Cloud Tasks .

Quando for necessário usar filas pull, como no enfileiramento de tarefas ou mensagens a serem extraídas e processadas por workers separados, o Cloud Pub/Sub é uma boa alternativa. Ele oferece uma funcionalidade semelhante e garantias de entrega.

Usuários

Como alternativa, use qualquer mecanismo de autenticação com base em HTTP em vez da API Users, como:

Desenvolvimento local

Em geral, recomendamos que o uso de uma abordagem dos testes que seja idiomática para o Python, em vez de depender do dev_appserver . Por exemplo, use o virtualenv para criar um ambiente Python 3.7 local isolado. Qualquer biblioteca de testes padrão do Python pode ser usada para escrever sua unidade, integração e testes de sistema. Você também pode configurar versões de desenvolvimento de seus serviços ou usar os emuladores locais disponíveis para muitos produtos do Google Cloud.

Como um recurso opcional para quem optar por usá-lo, estamos oferecendo uma versão alfa de um dev_appserver atualizado compatível com o Python 3. Para mais informações sobre essa opção, consulte Como usar o servidor de desenvolvimento local.