2010-04-26 23 views

Respuesta

30

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

Muestra proyecto de App Engine:

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

Y en views.py (o donde sea), a continuación, puede importar este modo:

import short_url 

Para proyectos más complejos, tal vez una mejor método es crear un directorio especialmente para las dependencias; dicen lib:

 
myapp/ 
    lib/ 
     __init__.py 
     short_url.py 
    app.yaml 
    index.yaml 
    main.py 
    views.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 ejecute 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 obtener este código se ejecute antes de todas las demás importaciones, se puede poner la ruta gestión de código en un fichero de su propia en el directorio de base de su aplicación (Python reconoce todo en ese directorio sin modificaciones de ruta).
Y entonces usted acaba de asegurarse de que esta importación

import fix_path 

... aparece antes de todas las demás importaciones en su archivo main.py.
Aquí hay un link to full, working example en caso de que mi explicación no estuviera clara.

+0

Todavía estoy recibiendo un problema, incluso después de reiniciar el servidor de la aplicación con este diseño. desde lib importación short_url ImportError: Ningún módulo llamado lib –

+0

Gracias - está funcionando ahora. ¿Dónde está el mejor lugar para llamar a fix_path()? Voy a llamar de esta manera: si __name__ == '__main__': fix_path() principal() Y luego he llamado a esta función desde mi código: def generate_key (id): SHORT_URL importación return short_url.encode_url (id) ¿Hay algún lugar al que pueda llamar fix_path() que permita mantener todas las importaciones juntas en la parte superior del archivo? –

+0

@Brian: genial. Me alegra que lo hayas hecho funcionar. Agregaré otro ejemplo para permitirle mantener las importaciones en un solo lugar. – bernie

0

Desde ese programa url_shortener escrito en python, puede simplemente incluir en su código fuente e importarlo como otros módulos de Python.

5

voy a secundar las respuestas dadas por @Adam Bernier y @ S.Mark, aunque Adam explica las cosas es un poco más detallado. en general, puede agregar cualquier módulo o paquete de Python puro a su directorio de App Engine y usarlo tal como está, siempre y cuando no intente trabajar fuera de la zona de pruebas, es decir, no pueda crear archivos, no pueda abrir tomas de red, etc. .

también tener en cuenta los límites duros:

  • número total máximo de archivos (archivos de aplicaciones y archivos estáticos): 3000
  • 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 máximo total de todas las aplicaciones y los archivos estáticos: 150 megabytes

ACTUALIZACIÓN (oct 2011): la mayor parte de estos números have been increased 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: 32 MB
  • tamaño máximo de un archivo estático: 32MB

ACTUALIZACIÓN (jun 2012): el último límite de was bumped up a:

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

Puede importar paquetes de Python como archivos ZIP. Esto le permite evitar el conteo máximo de archivos.

dirección app engine docs dirección esto.

python 2.5: zipimport is supported.

python 2.7: zipimport is not supported, but Python 2.7 can natively import from .zip files.

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 

Los contras 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).

Así que para importar el boto naturalmente, puede que tengas que hacer desde boto import boto, pero esto puede causar rareza con una falta de __init__.py.

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