2

I have a directory like the following:

my_dir
  |__data_reader
  |    |__reader.py
  |    |__ __init__.py
  |         
  |__folder1
  |    |__folder2
  |           |__ analyzer.py
  |           |__ __init__.py

I would like to import a module from reader.py in analyzer.py. I have tried:

from data_reader.reader import my_module

and got this error:

ModuleNotFoundError: No module named 'data_reader'

Note: I cannot use: from my_dir.data_reader.reader import my_module, while the name my_Dir might change and I would like to do it in a clean way that would take care of these issues.

tried:

from ..data_reader.reader import my_module

or

from ...data_reader.reader import my_module

and got the following error:

ImportError: attempted relative import with no known parent package, although I have init.py in both directories.

I also tried to join the directory here using:

REPO_ROOT_DIRECTORY = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
DATA_READER_DIRECTORY = os.path.join(REPO_ROOT_DIRECTORY, "data_reader")

but still import DATA_READER_DIRECTORY was not recognized

UPDATE:

I realized something interesting, as I tried to run this code in pycharm, the first code works fine, and all the relative imports are also fine. However, when I try it in the pycharm terminal or in my terminal, it sends the errors. I would be grateful if someone can explain why these errors happen in the terminal and not in the pycharm run.

1

1 Answer 1

1

You should join absolute path of my_dir, which is data_reader's parent to the system path at the beginning of file analyzer.py Here is the example.

# analyzer.py
import sys
from pathlib import Path
parent_of_data_reader = str(Path('../../').absolute())
sys.path.insert(0, parent_of_data_reader)
# import hello from module data_reader
from data_reader import hello

Note: hello is a variable declared in my_dir/data_reader/__init__.py. If you want you want to import things from my_dir/data_reader/reader.py, try

# analyzer.py
import sys
from pathlib import Path
parent_of_data_reader = str(Path('../../').absolute())
sys.path.insert(0, parent_of_data_reader)
# import hello from module data_reader.reader
# hello is a variable declared in reader.py
from data_reader.reader import hello

Then you will be able to import your module without error.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.