¿Cómo importar módulos en Google App Engine?

He creado una aplicación GAE sencilla basada en la plantilla predeterminada. Quiero agregar un módulo externo como short_url . ¿Cómo hago esto? Las direcciones que he encontrado hasta ahora son confusas y GAE no parece usar PYTHONPATH por razones obvias, supongo.

Simplemente coloque el archivo short_url.py en el directorio de su aplicación.

Proyecto de muestra App Engine:

 myapp /
     app.yaml
     index.yaml
     main.py
     short_url.py
     vistas.py

Y en views.py (o donde sea), puedes importar así:

 import short_url 

Para proyectos más complejos, quizás un método mejor es crear un directorio especialmente para dependencias; di lib

 myapp /
     lib /
         __init__.py
         short_url.py
     app.yaml
     index.yaml
     main.py
     vistas.py
 from lib import short_url 

Edición # 2:
Disculpas, debería haber mencionado esto antes. Necesita modificar su ruta, gracias a Nick Johnson por la siguiente solución.
Asegúrese de que este código se ejecuta antes de iniciar su aplicación; algo como esto:

 import os import sys def fix_path(): # credit: Nick Johnson of Google sys.path.append(os.path.join(os.path.dirname(__file__), 'lib')) def main(): url_map = [ ('/', views.IndexHandler),] # etc. app = webapp.WSGIApplication(url_map, debug=False) wsgiref.handlers.CGIHandler().run(app) if __name__ == "__main__": fix_path() main() 

Edit3:
Para que este código se ejecute antes de todas las demás importaciones, puede colocar el código que administra la ruta en un archivo propio en el directorio base de su aplicación (Python reconoce todo en ese directorio sin ninguna modificación de la ruta).
Y luego te asegurarías de que esta importación

 import fix_path 

… aparece antes de todas las demás importaciones en su archivo main.py
Aquí hay un enlace al ejemplo completo, en caso de que mi explicación no fuera clara.

Respaldaré las respuestas dadas por @Adam Bernier y @ S.Mark, aunque adam’s explica que las cosas son un poco más detalladas. en general, puede agregar cualquier módulo / paquete de Python puro a su directorio de App Engine y usarlo tal como está, siempre que no intenten trabajar fuera de la caja de arena, es decir, no pueden crear archivos, no pueden abrir sockets de red, etc. .

También ten en cuenta los límites duros:

  • Número total máximo de archivos (archivos de aplicaciones y archivos estáticos): 3,000
  • Tamaño máximo de un archivo de aplicación: 10 megabytes.
  • Tamaño máximo de un archivo estático: 10 megabytes.
  • Tamaño total máximo de todas las aplicaciones y archivos estáticos: 150 megabytes

ACTUALIZACIÓN (octubre de 2011): la mayoría de estos números se han incrementado a:

  • Número total máximo de archivos (archivos de aplicaciones y archivos estáticos): 10,000
  • Tamaño máximo de un archivo de aplicación: 32MB
  • Tamaño máximo de un archivo estático: 32MB

ACTUALIZACIÓN (junio de 2012): el último límite se incrementó hasta :

  • Tamaño total máximo de todas las aplicaciones y archivos estáticos: 1 GB

Puede importar paquetes de python como ZIPs. Esto le permite evitar el número máximo de archivos.

Los documentos del motor de aplicaciones abordan esto.

Python 2.5: zipimport es compatible.

python 2.7: zipimport no es compatible, pero Python 2.7 puede importar de forma nativa desde archivos .zip.

Así es como importo el boto.

 sys.path.insert(0, 'boto.zip') import boto #pylint: disable=F0401 from boto import connect_fps #pylint: disable=F0401 

Las desventajas de esta técnica incluyen tener que volver a archivar manualmente muchos paquetes.

Por ejemplo, boto.zip se descomprime en el subdirectorio “boto”, con el módulo “boto” dentro de él (como otro subdirectorio).

Entonces, para importar boto, naturalmente, es posible que tengas que hacerlo desde boto import boto, pero esto puede causar rarezas con la falta de __init__.py.

Para resolver esto, simplemente descomprima y archive la subcarpeta boto manualmente como boto.zip, y colóquela en la carpeta de su aplicación.

Desde ese progtwig url_shortener escrito en python, puede incluirlo en su código fuente e importarlo como otros módulos de python.