Usar bibliotecas Python 2

Pode usar bibliotecas de terceiros que sejam código Python puro sem extensões C, copiando a biblioteca para o diretório da aplicação. Se a biblioteca de terceiros já estiver incorporada, incluída no tempo de execução, pode usar a biblioteca sem a copiar para a sua app.

As bibliotecas de terceiros têm de ser implementadas como código Python puro sem extensões C. Se forem copiadas para o diretório da aplicação, contam para as quotas de ficheiros, uma vez que a biblioteca é carregada para o App Engine juntamente com o código da aplicação.

Copiar uma biblioteca de terceiros

Para usar uma biblioteca de terceiros que não está na lista de bibliotecas incorporadas incluídas no tempo de execução:

  1. Crie um diretório para armazenar as suas bibliotecas de terceiros, como lib/.

    mkdir lib
    
  2. Use o pip (versão 6 ou posterior) com a flag -t <directory> para copiar as bibliotecas para a pasta que criou no passo anterior. Por exemplo:

    pip install -t lib/ <library_name>
    

    Está a usar o Python do Homebrew no macOS?

  3. Crie um ficheiro denominado appengine_config.py na mesma pasta que o ficheiro app.yaml.

  4. Edite o ficheiro appengine_config.py e faculte o diretório da biblioteca ao método vendor.add().

    # appengine_config.py
    from google.appengine.ext import vendor
    
    # Add any libraries install in the "lib" folder.
    vendor.add('lib')
    

    O ficheiro appengine_config.py acima pressupõe que o diretório de trabalho atual é onde se encontra a pasta lib. Em alguns casos, como os testes unitários, o diretório de trabalho atual pode ser diferente. Para evitar erros, pode transmitir explicitamente o caminho completo para a pasta lib através do seguinte:

    vendor.add(os.path.join(os.path.dirname(os.path.realpath(__file__)), 'lib'))
    

Usar ficheiros de requisitos pip com bibliotecas copiadas

pip pode ler uma lista de bibliotecas a instalar a partir de um ficheiro, conhecido como um ficheiro de requisitos. Os ficheiros de requisitos facilitam a configuração de um novo ambiente de desenvolvimento para a sua app e a atualização para novas versões de bibliotecas.

Um ficheiro de requisitos é um ficheiro de texto com uma linha por biblioteca, que indica o nome do pacote e, opcionalmente, a versão do pacote (predefinição: mais recente):

Flask==0.10
Markdown==2.5.2
google-api-python-client

Para instalar as bibliotecas a partir de um ficheiro de requisitos, use a flag -r, além da flag -t lib:

pip install -t lib -r requirements.txt

Usar uma biblioteca de terceiros integrada incluída no tempo de execução

Se a biblioteca de terceiros estiver na lista de bibliotecas incorporadas incluídas no tempo de execução do Python do App Engine, só tem de a especificar na diretiva libraries no app.yaml, por exemplo:

libraries:
- name: PIL
  version: "1.1.7"
- name: webob
  version: "1.1.1"

O App Engine fornece automaticamente as bibliotecas pedidas durante a implementação.

Usar bibliotecas agrupadas integradas com o servidor de desenvolvimento local

Muitas das bibliotecas integradas fornecidas pelo tempo de execução estão automaticamente disponíveis para o servidor de desenvolvimento local. Para instalar algumas bibliotecas localmente, tem de executar gcloud components install app-engine-python-extras. Se o servidor de desenvolvimento local detetar que este componente é necessário, pede-lhe que o instale. As seguintes bibliotecas incorporadas têm de ser instaladas localmente antes de as poder usar com o servidor de desenvolvimento local:

Pode usar o comando pip para instalar todos estes pacotes a partir do índice de pacotes Python (PyPI).

sudo pip install lxml==2.3.5

Consoante a sua plataforma, pode ter de instalar ferramentas de suporte de compilação e origens Python para instalar estas bibliotecas.

  • No Linux, o gestor de pacotes pode fornecer estes pré-requisitos e, muitas vezes, fornecer uma versão pré-criada da biblioteca.
  • No Windows, os instaladores para versões pré-criadas estão normalmente disponíveis.
  • No macOS, as ferramentas de linha de comandos do Xcode são necessárias para criar alguns pacotes.

O servidor de desenvolvimento usa a versão do pacote que instalou localmente, independentemente da versão especificada em app.yaml. Se quiser, configure um virtualenv para o seu projeto para fornecer a versão exata do pacote. Tenha em atenção que o virtualenv só é usado para estes pacotes binários localmente e não é disponibilizado à sua aplicação após a implementação. Para adicionar bibliotecas de terceiros adicionais, use o método descrito em Instalar uma biblioteca.

Usar o Django no servidor de desenvolvimento local

O Django é uma framework de aplicações Web com todas as funcionalidades para Python. Oferece uma pilha completa de componentes intercambiáveis, incluindo componentes de envio, vistas, middleware e modelos, entre muitos outros.

A interface de modelagem de dados do Django não é compatível com o datastore do App Engine. Pode usar as bibliotecas de modelagem de dados do App Engine (db ou ndb) nas suas aplicações Django. No entanto, as aplicações Django de terceiros que usam a interface de modelagem de dados do Django, nomeadamente a aplicação de administração do Django, podem não funcionar diretamente com o App Engine.

A biblioteca de modelagem do Datastore (DB) é a predefinição. Em alternativa, para usar o Django com a API de armazenamento NDB, adicione 'google.appengine.ext.ndb.django_middleware.NdbDjangoMiddleware', à entrada MIDDLEWARE_CLASSES no ficheiro settings.py do Django. É recomendável inseri-lo antes de quaisquer outras classes de middleware, uma vez que alguns outros middleware podem fazer chamadas de armazenamento de dados e estas não são processadas corretamente se esse middleware for invocado antes deste middleware. Pode saber mais acerca do middleware Django na documentação do projeto.

Para ativar o Django na sua app, especifique a aplicação WSGI e a biblioteca Django em app.yaml:

...
handlers:
- url: /.*
  script: main.app  # a WSGI application in the main module's global scope

libraries:
- name: django
  version: "1.4"

A variável de ambiente DJANGO_SETTINGS_MODULE tem de ser definida com o nome do módulo de definições do Django, normalmente 'settings', antes de os pacotes serem importados.

Se o seu módulo de definições do Django for algo diferente de settings.py, defina a variável de ambiente DJANGO_SETTINGS_MODULE em conformidade no seu ficheiro app.yaml:

env_variables:
  DJANGO_SETTINGS_MODULE: 'myapp.settings'

Ou no seu código Python:

import os
# specify the name of your settings module
os.environ['DJANGO_SETTINGS_MODULE'] = 'myapp.settings'

import django.core.handlers.wsgi
app = django.core.handlers.wsgi.WSGIHandler()

Usar matplotlib no servidor de desenvolvimento local

O Matplotlib é uma biblioteca de representação gráfica que produz gráficos e figuras numa variedade de formatos de imagem. No App Engine, os modos interativos do matplotlib não são suportados e várias outras funcionalidades também não estão disponíveis. Isto significa que não pode usar pyplot.show() como muitos tutoriais do matplotlib sugerem. Em alternativa, deve usar pyplot.savefig() para escrever dados de imagens na stream de saída, numa instância de cStringIO.StringIO ou no Google Cloud Storage através da biblioteca de cliente do Cloud Storage.

O Matplotlib permite uma personalização extensiva através da utilização do ficheiro de configuração matplotlibrc, que deve ser colocado no diretório de nível superior da aplicação. Em alternativa, pode definir a variável de ambiente MATPLOTLIBRC para um caminho relativo ao diretório da sua aplicação.

O backend predefinido é AGG, que permite escrever ficheiros de todos os formatos suportados: PNG (o formato predefinido), RAW, PS, PDF, SVG e SVGZ. Se disponibilizar a biblioteca PIL adicionando PIL à secção libraries de app.yaml, o back-end AGG também vai suportar automaticamente a escrita de formatos de imagem JPEG e TIFF.

O Matplotlib inclui vários tipos de letra que estão automaticamente disponíveis. Pode usar tipos de letra personalizados carregando-os no formato TTF juntamente com a sua aplicação e definindo a variável de ambiente TTFPATH para o caminho onde se encontram, relativamente ao diretório da sua aplicação. Para mais informações, consulte a app.yaml referência.

Várias funcionalidades do matplotlib não são suportadas no App Engine. Concretamente:

  • Não existe um diretório ~/.matplotlib. No entanto, existem localizações alternativas para colocar o ficheiro de configuração matplotlibrc, conforme descrito acima.
  • Os backends interativos e os elementos da GUI não são suportados.
  • Os backends EMF, Cairo e GDK não são suportados.
  • Não existe colocação em cache e, por isso, vários mecanismos recalculam ou voltam a transferir dados que normalmente seriam colocados em cache. Os mecanismos de colocação em cache específicos que foram desativados incluem dados de tipos de letra calculados pela matplotlib.font_manager.FontManager.findfont, dados de amostra transferidos pela matplotlib.cbook.get_sample_data e dados financeiros transferidos pela matplotlib.finance.fetch_historical_yahoo.
    • Como não existe colocação em cache, não é possível chamar o número [matplotlib.cbook.get_sample_data](http://matplotlib.org/api/cbook_api.html#matplotlib.cbook.get_sample_data) com o número asfileobj=False, a menos que o número examples.download esteja definido como False.
  • Todas as funcionalidades que invocam comandos externos foram desativadas.
    • A utilização da funcionalidade fontconfig foi desativada. As fontes encontram-se através do mecanismo descrito acima.
    • A utilização de LaTeX para a renderização de texto não é suportada. A definição de text.usetex para True não funciona.
    • A utilização de um programa de destilação PostScript externo não é suportada. A definição de ps.usedistiller como ghostscript ou xpdf não funciona.
    • A utilização de um programa de codificação de vídeo externo não é suportada. O método matplotlib.animation.Animation.save não funciona e, por isso, o pacote matplotlib.animation não é útil.
    • A função matplotlib.cbook.report_memory e a classe matplotlib.cbook.MemoryMonitor não são suportadas.
  • A função matplotlib.test foi desativada.

O que se segue?