I have two python modules which I am trying to import using sys.path.append and sys.path.insert. Following is my code
import sys
sys.path.insert(1, "/home/sam/pythonModules/module1")
sys.path.append("/home/sam/pythonModules/module2")
from lib.module1 import A
from lib.module2 import B
I have following folder structure
/home/sam/pythonModules/module1/lib/module1.py
/home/sam/pythonModules/module2/lib/module2.py
I am able to import lib.module1 but not lib.module2. If I do it like this
import sys
sys.path.insert(1, "/home/sam/pythonModules/module2")
sys.path.append("/home/sam/pythonModules/module1")
from lib.module1 import A
from lib.module2 import B
then I am able to import module2 but not module1.
What can be the reason for the above importing errors?
I tried append instead of insert in following manner but it's still doesn't work
import sys
sys.path.append("/home/sam/pythonModules/module1")
sys.path.append("/home/sam/pythonModules/module2")
from lib.module1 import A
from lib.module2 import B
Always only first module in sys.path.append is successfully imported.
But I make some changes to paths in sys.path.append in following manner then it works. Both the modules are imported successfully
import sys
sys.path.append("/home/sam/pythonModules/module1")
sys.path.append("/home/sam/pythonModules/module2/lib")
from lib.module1 import A
from module2 import B
2 Answers 2
I'm afraid you can't do it that way.
Because of structure:
/home/sam/pythonModules/module1/lib/module1.py
/home/sam/pythonModules/module2/lib/module2.py
You can't put both:
/home/sam/pythonModules/module1and/home/sam/pythonModules/module2
in sys.path and expect that Python will find:
module1inmodule1/libandmodule2inmodule2/lib
when you try import like:
from lib.module1 import A
from lib.module2 import B
If you put /home/sam/pythonModules/module1 before /home/sam/pythonModules/module2 in sys.path array, then import lib.MODULE will search for MODULE in /home/sam/pythonModules/module1/lib.
Since there is only module1 and no module2 in it, you get error.
What you can do is to put both
/home/sam/pythonModules/module1/lib/and/home/sam/pythonModules/module2/lib/
in sys.path and expect Python to correctly import them with next lines:
from module1 import A
from module2 import B
2 Comments
/home/sam/pythonModules/module1 and /home/sam/pythonModules/module2 are both different path names.lib package, it finds it in first one of those paths and then uses that one for resolving subpackages/modules imports.Useless to use sys.path.insert, only if you want to prioritize your project before another in PYTHONPATH.
import sys
sys.path.append("/home/sam/pythonModules/module1")
sys.path.append("/home/sam/pythonModules/module2")
from lib.module1 import A
from lib.module2 import B
Your projects module1 / module2 should be also structured as valid package, let see official guidelines: http://docs.python-guide.org/en/latest/writing/structure/
appendandinsertonsys.path?