Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to import a module from a different folder?

I have a project which I want to structure like this:

myproject   __init__.py   api     __init__.py     api.py   backend     __init__.py     backend.py   models     __init__.py     some_model.py 

Now, I want to import the module some_model.py in both api.py and backend.py. How do I properly do this?

I tried:

from models import some_model 

but that fails with ModuleNotFoundError: No module named 'models'.

I also tried:

from ..models import some_model 

which gave me ValueError: attempted relative import beyond top-level package.

What am I doing wrong here? How can I import a file from a different directory, which is not a subdirectory?

like image 255
Gasp0de Avatar asked Feb 28 '18 22:02

Gasp0de


People also ask

How do I import a module into another folder?

The most Pythonic way to import a module from another folder is to place an empty file named __init__.py into that folder and use the relative path with the dot notation. For example, a module in the parent folder would be imported with from .. import module .


2 Answers

Firstly, this import statement:

from models import some_model 

should be namespaced:

# in myproject/backend/backend.py or myproject/api/api.py from myproject.models import some_model 

Then you will need to get the directory which contains myproject, let's call this /path/to/parent, into the sys.path list. You can do this temporarily by setting an environment variable:

export PYTHONPATH=/path/to/parent 

Or, preferably, you can do it by writing a setup.py file and installing your package. Follow the PyPA packaging guide. After you have written your setup.py file, from within the same directory, execute this to setup the correct entries in sys.path:

pip install --editable . 
like image 111
wim Avatar answered Sep 21 '22 17:09

wim


Unfortunately, Python will only find your file if your file is in the systems path. But fear not! There is a way around this!

Using python's sys module, we can add a directory to the path just while Python is running, and once Python stops running, it will remove it from the path.

You can do this by:

import sys sys.path.insert(0, '/path/to/application/app/folder') import [file] 

It is important to import sys and set the directory path before you import the file however.

Good luck!

Jordan.

like image 35
Jordan Mattiuzzo Avatar answered Sep 18 '22 17:09

Jordan Mattiuzzo