This is my package hierarchy
app
|--__init__.py //Empty file
|--server.py
|--global_vars.py
|
|--handlers
|--__init__.py //Empty file
|
|--url1
| |--__init__.py //Empty file
| |--app1.py
| |--app2.py
|
|--url2
|--__init__.py //Empty file
|--app3.py
Now I want to import global_vars.py
inside app1.py
.
So I gave
import app.global_vars.py
inside app1.py.
But I get the following error:
import app.global_vars
ImportError: No module named app.global_vars
I should also mention that I am importing app1.py from server.py. server.py
is the file I am actually running. When server.py imports app1.py, app1.py
tries to import global_vars.py
and I get the above mentioned error
What am I doing wrong here?
If you are running app/server.py
as a script, the parent directory of app
is not added to sys.path()
. The app
directory itself is added instead (not as a package but as a import search path).
You have 4 options:
- Move
server.py
out of theapp
package (next to it) Add a new script file next to
app
that only runs:from app import server server.main()
Use the
-m
switch option to run a module as the main entry point:python -m app.server
Add the parent directory of
server.py
tosys.path
:import os.path import sys parent = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.insert(0, parent)
This last option can introduce more problems however; now both the
app
package and the modules contained in theapp
package are onsys.path
. You can import bothapp.server
andserver
and Python will see these as two separate modules, each with their own entry insys.modules
, with separate copies of their globals.
need __init__.py
file, will regard it as a package
app
|--server.py
|--global_vars.py
|--handlers
|--__init__.py
...
__init__.py
can be empty
来源:https://stackoverflow.com/questions/16786485/python-import-modules-from-a-higher-level-package