Usar bibliotecas de Python 2

Puedes usar bibliotecas de terceros que sean código Python puro sin extensiones de C copiando la biblioteca en el directorio de tu aplicación. Si la biblioteca de terceros ya está integrada, incluida en el tiempo de ejecución, puedes usarla sin copiarla en tu aplicación.

Las bibliotecas de terceros deben implementarse como código Python puro sin extensiones de C. Si se copian en el directorio de tu aplicación, se tienen en cuenta para las cuotas de archivos, ya que la biblioteca se sube a App Engine junto con el código de tu aplicación.

Copiar una biblioteca de terceros

Para usar una biblioteca de terceros que no esté en la lista de bibliotecas integradas incluidas en el tiempo de ejecución, sigue estos pasos:

  1. Crea un directorio para almacenar tus bibliotecas de terceros, como lib/.

    mkdir lib
    
  2. Usa pip (versión 6 o posterior) con la marca -t <directory> para copiar las bibliotecas en la carpeta que has creado en el paso anterior. Por ejemplo:

    pip install -t lib/ <library_name>
    

    ¿Usas Python de Homebrew en macOS?

  3. Crea un archivo llamado appengine_config.py en la misma carpeta que el archivo app.yaml.

  4. Edita el archivo appengine_config.py y proporciona el directorio de tu biblioteca al método vendor.add().

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

    El archivo appengine_config.py anterior presupone que el directorio de trabajo actual es donde se encuentra la carpeta lib. En algunos casos, como en las pruebas unitarias, el directorio de trabajo actual puede ser diferente. Para evitar errores, puedes introducir explícitamente la ruta completa a la carpeta lib mediante:

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

Usar archivos de requisitos pip con bibliotecas copiadas

pip puede leer una lista de bibliotecas que se van a instalar desde un archivo, conocido como archivo de requisitos. Los archivos de requisitos facilitan la configuración de un nuevo entorno de desarrollo para tu aplicación y la actualización a nuevas versiones de bibliotecas.

Un archivo de requisitos es un archivo de texto con una línea por biblioteca, en el que se indica el nombre del paquete y, opcionalmente, la versión del paquete (la más reciente de forma predeterminada):

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

Para instalar las bibliotecas desde un archivo de requisitos, usa la marca -r además de la marca -t lib:

pip install -t lib -r requirements.txt

Usar una biblioteca de terceros integrada incluida en el tiempo de ejecución

Si la biblioteca de terceros está en la lista de bibliotecas integradas incluidas en el entorno de ejecución de Python de App Engine, solo tienes que especificarla en la directiva libraries del archivo app.yaml. Por ejemplo:

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

App Engine proporciona automáticamente las bibliotecas solicitadas durante la implementación.

Usar bibliotecas empaquetadas integradas con el servidor de desarrollo local

Muchas de las bibliotecas integradas que proporciona el tiempo de ejecución están disponibles automáticamente en el servidor de desarrollo local. Para instalar algunas bibliotecas localmente, debes ejecutar gcloud components install app-engine-python-extras. Si el servidor de desarrollo local detecta que se necesita este componente, te pedirá que lo instales. Las siguientes bibliotecas integradas deben instalarse localmente para poder usarlas con el servidor de desarrollo local:

Puedes usar el comando pip para instalar todos estos paquetes desde el índice de paquetes de Python (PyPI).

sudo pip install lxml==2.3.5

En función de tu plataforma, es posible que tengas que instalar herramientas de asistencia para compilaciones y fuentes de Python para instalar estas bibliotecas.

  • En Linux, el gestor de paquetes puede proporcionar estos requisitos previos y, a menudo, una versión precompilada de la biblioteca.
  • En Windows, suelen estar disponibles los instaladores de versiones prediseñadas.
  • En macOS, se necesitan las herramientas de línea de comandos de Xcode para compilar algunos paquetes.

El servidor de desarrollo usa la versión del paquete que has instalado localmente, independientemente de la versión especificada en app.yaml. Si quieres, configura un virtualenv para tu proyecto y así proporcionar la versión exacta del paquete. Ten en cuenta que el entorno virtual solo se usa para estos paquetes binarios de forma local y no estará disponible para tu aplicación una vez que se haya implementado. Para añadir bibliotecas de terceros adicionales, usa el método descrito en Instalar una biblioteca.

Usar Django en el servidor de desarrollo local

Django es un framework de aplicaciones web con todas las funciones para Python. Proporciona una pila completa de componentes intercambiables, como componentes de envío, vistas, middleware y plantillas, entre muchos otros.

La interfaz de modelado de datos de Django no es compatible con el almacén de datos de App Engine. Puedes usar las bibliotecas de modelado de datos de App Engine (db o ndb) en tus aplicaciones Django. Sin embargo, es posible que las aplicaciones Django de terceros que usen la interfaz de modelado de datos de Django, sobre todo la aplicación Admin de Django, no funcionen directamente con App Engine.

La biblioteca de modelado de Datastore (DB) es la predeterminada. Para usar Django con la API de almacenamiento NDB, añade 'google.appengine.ext.ndb.django_middleware.NdbDjangoMiddleware', a la entrada MIDDLEWARE_CLASSES en el archivo settings.py de Django. Es recomendable insertarlo antes de cualquier otra clase de middleware, ya que algunos otros middlewares pueden hacer llamadas al almacén de datos y no se gestionarán correctamente si se invoca ese middleware antes que este. Puedes consultar más información sobre el middleware de Django en la documentación del proyecto.

Para habilitar Django en tu aplicación, especifica la aplicación WSGI y la biblioteca Django en app.yaml:

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

libraries:
- name: django
  version: "1.4"

La variable de entorno DJANGO_SETTINGS_MODULE debe tener el nombre de tu módulo de ajustes de Django, normalmente 'settings', antes de importar los paquetes.

Si tu módulo de ajustes de Django es distinto de settings.py, define la variable de entorno DJANGO_SETTINGS_MODULE en tu archivo app.yaml:

env_variables:
  DJANGO_SETTINGS_MODULE: 'myapp.settings'

O en tu código de 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 en el servidor de desarrollo local

Matplotlib es una biblioteca de gráficos que genera gráficos y figuras en varios formatos de imagen. En App Engine, no se admiten los modos interactivos de matplotlib y tampoco están disponibles otras funciones. Esto significa que no puedes usar pyplot.show() como sugieren muchos tutoriales de matplotlib. En su lugar, debes usar pyplot.savefig() para escribir datos de imagen en el flujo de salida, una instancia de cStringIO.StringIO o Google Cloud Storage mediante la biblioteca de cliente de Cloud Storage.

Matplotlib permite una amplia personalización mediante el uso del archivo de configuración matplotlibrc, que debe colocarse en el directorio de nivel superior de la aplicación. También puedes asignar a la variable de entorno MATPLOTLIBRC una ruta relativa al directorio de tu aplicación.

El backend predeterminado es AGG, que permite escribir archivos de todos los formatos admitidos: PNG (el formato predeterminado), RAW, PS, PDF, SVG y SVGZ. Si pones a disposición la biblioteca PIL añadiendo PIL a la sección libraries de app.yaml, el backend de AGG también admitirá automáticamente la escritura de formatos de imagen JPEG y TIFF.

Matplotlib incluye varias fuentes que están disponibles automáticamente. Puedes usar fuentes personalizadas subiéndolas en formato TTF junto con tu aplicación y definiendo la variable de entorno TTFPATH en la ruta donde se encuentran, en relación con el directorio de tu aplicación. Para obtener más información, consulta la app.yaml referencia.

Algunas funciones de matplotlib no son compatibles con App Engine. En particular:

  • No hay ningún directorio ~/.matplotlib. Sin embargo, hay otras ubicaciones para colocar el archivo de configuración matplotlibrc, como se ha descrito anteriormente.
  • No se admiten back-ends interactivos ni elementos de interfaz gráfica de usuario.
  • No se admiten los back-ends EMF, Cairo y GDK.
  • No se utiliza el almacenamiento en caché y, por lo tanto, varios mecanismos volverán a calcular o descargar datos que normalmente se almacenarían en caché. Entre los mecanismos de almacenamiento en caché específicos que se han inhabilitado se incluyen los datos de fuentes calculados por matplotlib.font_manager.FontManager.findfont, los datos de muestra descargados por matplotlib.cbook.get_sample_data y los datos financieros descargados por matplotlib.finance.fetch_historical_yahoo.
    • Como no hay almacenamiento en caché, no es posible llamar a [matplotlib.cbook.get_sample_data](http://matplotlib.org/api/cbook_api.html#matplotlib.cbook.get_sample_data) con asfileobj=False a menos que examples.download esté configurado como False.
  • Se han inhabilitado todas las funciones que invocan comandos externos.
    • Se ha inhabilitado el uso de fontconfig. Las fuentes se encuentran mediante el mecanismo descrito anteriormente.
    • No se admite el uso de LaTeX para el renderizado de texto. Si asignas el valor text.usetex a True, no funcionará.
    • No se admite el uso de un programa de destilación PostScript externo. Si asignas el valor ghostscript o xpdf a ps.usedistiller, no funcionará.
    • No se admite el uso de un programa de codificación de vídeo externo. El método matplotlib.animation.Animation.save no funcionará y, por lo tanto, el paquete matplotlib.animation no será útil.
    • No se admiten la función matplotlib.cbook.report_memory ni la clase matplotlib.cbook.MemoryMonitor.
  • La función matplotlib.test se ha inhabilitado.

Siguientes pasos