function - ¿Cómo puedo usar los módulos en web2py?
module import (2)
Solo para agregar un poco a la respuesta del usuario 570039, local_import se documenta here . Incluye un parámetro de reload
. Según la documentación:
Cuando especifique
reload=True
, volverá a importar el módulo en cada solicitud; de lo contrario, su proceso de python solo importará el módulo una vez. El valor predeterminado esreload=False
.
En desarrollo, la configuración de reload=True
puede ser conveniente porque los cambios en su módulo funcionarán inmediatamente sin necesidad de reiniciar. Sin embargo, volver a importar cada solicitud ralentizará el rendimiento, por lo que se recomienda reload=False
en producción.
ACTUALIZACIÓN: Las cosas han cambiado. local_import
ha quedado en desuso . Si tiene /applications/myapp/modules/mymodule.py, puede importarlo dentro de myapp haciendo lo siguiente:
import mymodule
web2py comprobará la carpeta de "módulos" de la aplicación antes de verificar el resto de sys.path.
Para más detalles, ver here .
Tengo algunas funciones en func.py
que me gustaría acceder desde mi controlador web2py llamado default.py
. Intenté 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.
¿Por qué no funciona? ¿Cómo puedo hacerlo funcionar? ¿Debería el módulo estar en func.py
o por default/func.py
o algo más?
func
tiene que estar en un lugar que esté en PYTHONPATH
(sys.path) como web2py/site-packages
. Esta es la forma correcta de hacerlo por parte de los pitones.
Si, en cambio, desea empaquetar su módulo con su aplicación , colóquelo en applications/yourapp/modules
, a continuación, debe importarlo con func = local_import(''func'')
P: Las personas que son nuevas en web2py pueden preguntarse: ¿por qué usar local_import()
cuando el método anterior es el estándar en el mundo de Python?
R: Porque en web2py puedes instalar nuevas aplicaciones sin reiniciar el servidor. Las aplicaciones no pueden cambiar sys.path
porque no es seguro para subprocesos y dependería del orden en que se instalen. Además, dos aplicaciones pueden requerir módulos con el mismo nombre pero diferentes (por ejemplo, versiones diferentes). 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 importarlos sin agregar la carpeta a sys.path
y causar conflictos de versión.