2011-01-11 16 views
19

Tengo algunas funciones en func.py a las que me gustaría acceder desde mi controlador web2py llamado default.py. Traté de importar y usar func.py en default.py con "import func" y "calculatesomething = func.calculatesomething", pero no funciona. El archivo func.py también se agrega en la sección Módulos de mi programa web2py.¿Cómo puedo usar módulos en web2py?

¿Por qué no funciona? ¿Cómo puedo hacer para que funcione? ¿Debe el módulo estar en func.py o default/func.py o algo más?

Respuesta

27

func tiene que estar en un lugar que está en PYTHONPATH (sys.path) como web2py/site-packages. Esta es la forma propia de Pitón de hacerlo.

Si por el contrario desea paquete de su módulo con su aplicación, luego se coloca en applications/yourapp/modules, al lado, debe importar con func = local_import('func')

Q: Las personas que son nuevos en web2py puede preguntarse: ¿por qué use local_import() cuando el método anterior es el estándar en el mundo de Python?

A: Porque en web2py puede instalar nuevas aplicaciones sin reiniciar el servidor. Las aplicaciones no pueden cambiar sys.path porque no es seguro para subprocesos y dependerá del orden en que se instalen esas aplicaciones. Además, dos aplicaciones pueden requerir módulos con el mismo nombre pero diferentes (por ejemplo, diferentes versiones). Queremos evitar conflictos entre esos módulos y otros módulos que pueden estar preinstalados.

local_import() es una solución que le permite enviar algunos módulos con sus aplicaciones e importarlas sin agregar la carpeta a sys.path y causar conflictos de versiones.

34

Solo para agregar un poco a la respuesta del usuario570039, se documenta el_porte_local here. Incluye un parámetro reload. De acuerdo con la documentación:

Al especificar reload=True, se volverá a importar el módulo cada vez que se solicite; de lo contrario, su proceso de python solo importará el módulo una vez. El valor predeterminado es reload=False.

En desarrollo, la configuración reload=True puede ser conveniente porque los cambios en su módulo funcionarán inmediatamente sin necesidad de reiniciar. Sin embargo, la reimportación con cada solicitud ralentizará el rendimiento, por lo que se recomienda reload=False en producción.


ACTUALIZACIÓN: cosas han cambiado. local_import ha quedado obsoleto. Si tiene /applications/myapp/modules/mymodule.py, puede importar dentro miaplicacion haciendo:

import mymodule 

web2py comprobará carpeta "módulos" de la aplicación antes de comprobar el resto de sys.path.

Para obtener más información, consulte here.

+0

¡Gracias chicos!¡Ambas respuestas fueron muy útiles! – user569474

+0

¿Cómo puedo hacer esto con las carpetas? Por ejemplo, cuando intento importar módulos llamados 'fuzz' y' process' en la biblioteca ['fuzzywuzzy'] (https://github.com/seatgeek/fuzzywuzzy) de'/applications/myapp/modules/fuzzywuzzy/'directory, usando' from fuzzywuzzy import fuzz, process' en GAE con Py2.7, obtengo un 'ImportError' que dice' Ningún módulo llamado fuzzywuzzy' – Sathvik

+0

Lo puse ' web2py/site-packages/fuzzywuzzy' y puedo importarlos ahora :) ... Pero todavía estoy interesado en la posibilidad de tener el módulo dentro del directorio 'web2py/applications/myapp/modules /', especialmente porque no No quiero romper accidentalmente mis aplicaciones anteriores cuando 'actualizo' mis módulos para aplicaciones más nuevas. – Sathvik

Cuestiones relacionadas