Don't mess with the search path
You are right not messing around with sys.path. This is not recommended and always just an ugly workaround. There are better solutions for this.
Restructure your folder layout
See official Python docs about packaging.
Distinguish between project folder and package folder. We assume your some_root folder as the package folder which is also the name of the package (used in import statements). And it is recommended to put the package folder into a folder named src. Above it is the project folder some_project. This project folder layout is also known as the "Src-Layout".
In your case it should look like this.
some_project
└── src
└── some_root
├── dir_0
│ ├── dir_1
│ │ ├── file_1.py
│ │ └── __init__.py
│ ├── dir_2
│ │ ├── file_2.py
│ │ └── __init__.py
│ └── __init__.py
└── __init__.py
Make your package installable
Create a some_project/setup.cfg with that content. Keep the line breaks and indention in line 5 and 6. They have to be like this but I don't know why.
[metadata]
name = some_project
[options]
package_dir=
=src
packages = find:
zip_safe = False
python_requires = >= 3
[options.packages.find]
where = src
exclude =
tests*
.gitignore
Create some_project/setup.py with that content:
from setuptools import setup
setup()
"Install" the package
This is not a usual installation. Please see Developement Mode to understand what this really means. The package is not copied into /usr/lib/python/site-packages; only links are created.
Navigate into the project folder some_project and run
python3 -m pip install --editable .
Don't forget the . at the end. Depending on your OS and environment maybe you have to replace python3 with py -3 or python or something else.
Import
Your file_2.py
import some_root
import some_root.dir_0
import some_root.dir_0.dir_1
from some_root.dir_0.dir_1 import file_1
file_1.foo()
But as others said in the comments. Improve your structure of files and folders and reduce its complexity.