He creado una aplicación GAE simple basada en la plantilla predeterminada. Quiero agregar un módulo externo como short_url. ¿Cómo hago esto? Las instrucciones que he encontrado hasta ahora son confusas y GAE no parece usar PYTHONPATH por razones obvias, supongo.¿Cómo importar módulos en Google App Engine?
Respuesta
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.
Desde ese programa url_shortener escrito en python, puede simplemente incluir en su código fuente e importarlo como otros módulos de Python.
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
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.
- 1. Google App Engine Locking
- 2. ¿Cómo se modifica sys.path en Google App Engine (Python)?
- 3. Google App Engine en Silverlight
- 4. Google App Engine: módulo JSON
- 5. web.py en Google App Engine
- 6. Google-app-engine NDB
- 7. Google App Engine Geohashing
- 8. Google App Engine
- 9. Google app engine & CDN
- 10. Google App Engine: get_or_create()?
- 11. eCommerce en Google App Engine
- 12. Django en Google App Engine
- 13. Jinja2 en Google App Engine
- 14. appengine_config.py en Google App Engine
- 15. mlpy, numpy, scipy en Google App Engine
- 16. Google App Engine en Google Apps Domain
- 17. Google App Engine - incremento automático
- 18. Google App Engine: autenticación personalizada
- 19. Google App Engine JDO 3
- 20. Google App Engine modifyThreadGroup problema
- 21. Google Maps y Google App Engine
- 22. debería dejar Google App Engine?
- 23. ¿Alternativa para Google App Engine?
- 24. Google App Engine: appcfg.py rollback
- 25. Google App Engine y dos.xml
- 26. Google App Engine y CORS
- 27. Google App Engine retraso extraño
- 28. Google App Engine - Cookies seguras
- 29. Google App Engine Task Deadline
- 30. OpenID para Google App Engine
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 –
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? –
@Brian: genial. Me alegra que lo hayas hecho funcionar. Agregaré otro ejemplo para permitirle mantener las importaciones en un solo lugar. – bernie