How can I use modules in web2py?
Solution 1
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.
Solution 2
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 isreload=False
.
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:
import mymodule
web2py will check the application's "modules" folder before checking the rest of sys.path.
For more details, see here.
user569474
Updated on June 06, 2022Comments
-
user569474 almost 2 years
I have some functions in
func.py
that I would like to access from my web2py controller calleddefault.py
. I tried to import and usefunc.py
indefault.py
with "import func" and "calculatesomething = func.calculatesomething", but it doesn't work. The filefunc.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
func.py
ordefault/func.py
or something else? -
user569474 over 13 yearsThank you, guys! Both of these answers were very helpful!
-
S P about 12 yearsHow can I do this with folders? For example, when I'm trying to import modules called
fuzz
andprocess
in thefuzzywuzzy
library from/applications/myapp/modules/fuzzywuzzy/
directory, usingfrom fuzzywuzzy import fuzz, process
on GAE with Py2.7, I'm getting anImportError
saying<type 'exceptions.ImportError'> No module named fuzzywuzzy
-
S P about 12 yearsI placed it in
web2py/site-packages/fuzzywuzzy
and am able to import them now :) ... But I still am interested in the possibility of having the module within theweb2py/applications/myapp/modules/
directory, especially because I don't want to accidentally break my older apps when I 'update' my modules for newer apps. -
S P about 12 yearsFor some reason I'm getting an
ImportError
even for the example above, i.e.web2py/applications/myapp/modules/func.py
withimport func
, in my modeldb.py
on Web2Py 1.99.7, on both GAE and when runningweb2py.py
(Although, it works fine whenfunc.py
is placed inweb2py/site-packages/
) -
Anthony about 12 yearsDoes your /modules folder contain an empty
__init__.py
file? -
S P about 12 yearsIt didn't have it at first, but I still get the same ImportError even after placing it. (Tested on: GAE, PyPy and Python27)
-
Charles L. over 10 yearsweb2py should also work if you put it in the modules folder and from applications.myapp.modules.fuzzywuzzy import fuzz, process
-
User over 10 yearsSince the original answer mentions
reload=True
, I think for a complete answer the update should include mention offrom gluon.custom_import import track_changes; track_changes(True)
as a replacement forreload=True
functionality