'Python3 importing files from parent directory / relative importing

I have the following file structure:

parentfolder/
   utils.py
   myProgram/
      main.py
      other.py

I will be running the main.py which utilizes other.py which needs to utilize everything in utils.py (NOT just import one method from utils.py at a time - there are global variables and functions that call other functions within this file.)

I have tried lots of different examples online utilizing sys, path, etc. Along with adding __init__.py in none, some, and all directories. None of which worked for me.

How do I go about this importing of utils.py within other.py?

If I need to create init.py files could you also specify where they need to be created and if anything needs to be placed in them? Do I need to run them once before running the main.py the first time?

Thank you so much for any help in advanced



Solution 1:[1]

Yes you should add init files as in:

parentfolder/
   __init__.py
   utils.py
   myProgram/
      __init__.py
      main.py
      other.py

Those can be empty or better containing a docstring on the package contents, but you should not run them or anything

The correct way is to run your script from the parent folder of the parentFolder using the module path:

$ cd parentfolder/..
$ python -m parentFolder.myProgram.main

This way the import utils statement will work without the sys.path hack which can lead to subtle bugs

Solution 2:[2]

This isn't necessarily the recommended approach, but it will work.

other.py

import sys
import os

parent_folder = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0,parent_folder)

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2