I have some functions in
func.py that I would like to access from my web2py controller called
default.py. I tried to import and use
default.py with "import func" and "calculatesomething = func.calculatesomething", but it doesn't work. The file
func.py is also added in the Modules section of my web2py program.
Why it is not working? How can I make it to work? Should the module be in
default/func.py or something else?
Just to add a bit to user570039's answer, local_import is documented here. It includes a
reload parameter. According to the documentation:
When you specify
reload=True, it will re-import the module upon each request; otherwise your python process will only import the module once. The default is
In development, setting
reload=True can be convenient because changes to your module will work immediately without requiring a restart. However, re-importing upon each request will slow down performance, so
reload=False is recommended in production.
UPDATE: Things have changed.
local_import has been deprecated. If you have /applications/myapp/modules/mymodule.py, you can import it within myapp by doing:
web2py will check the application's "modules" folder before checking the rest of sys.path.
For more details, see here.
func has to be in a place that is in
PYTHONPATH (sys.path) such as
web2py/site-packages. This is the proper Pythonic way of doing it.
If instead you want to package your module with your app, then place it in
applications/yourapp/modules, next, you should import it with
func = local_import('func')
Q: People who are new to web2py may wonder: why use
local_import() when the former method is the standard one in the Python world?
A: Because in web2py you can install new apps without restarting the server. Apps cannot change
sys.path because it is not thread safe and would depend on the order those apps are installed. Moreover two apps may require modules with the same name but different (for example different versions). We want to avoid conflicts between those modules and other modules that may be pre-installed.
local_import() is a workaround that allows you to ship some modules with your apps and import them without adding the folder to
sys.path and causing version conflicts.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!Donate Us With