I have a python application with the following directory structure:
src
|
+---- main
|
+---- util
|
+---- gen_py
|
+---- lib
In the package main, I have a python module named MyServer.py which has an import statement like:
from gen_py.lib import MyService
In order for this statement to work, I placed the following line at the beginning of MyServer.py:
import sys
sys.path.append('../gen_py/lib')
When I run MyServer.py in the terminal, I get the following error:
ImportError: No module named gen_py.lib
What I am missing here?
Make sure if root project directory is coming up in sys.path output. If not, please add path of root project directory to sys.path.
or
Make sure you have a (at least empty)
__init__.py
file on each directory.This is if you are building a package and you are finding error in imports. I learnt it the hard way.The answer isn't to add the package to python path or to do it programatically (what if your module gets installed and your command adds it again?) thats a bad way.
The right thing to do is: 1) Use virtualenv pyvenv-3.4 or something similar 2) Activate the development mode - $python setup.py develop
For the Python module import to work, you must have "src" in your path, not "gen_py/lib".
When processing an import like
import gen_py.lib
, it looks for a modulegen_py
, then looks for a submodulelib
.As the module
gen_py
won't be in "../gen_py/lib" (it'll be in ".."), the path you added will do nothing to help the import process.Depending on where you're running it from, try adding the relative path to the "src" folder. Perhaps it's
sys.path.append('..')
. You might also have success running the script while inside the src folder directly, via relative paths likepython main/MyServer.py
Your modification of
sys.path
assumes the current working directory is always inmain/
. This is not the case. Instead, just add the parent directory tosys.path
:Don't forget to include a file
__init__.py
in gen_py and lib - otherwise, they won't be recognized as Python modules.make sure to include
__init__.py
, which makes Python know that those directories containpackages