Я борюсь с настройкой импорта в пакет таким образом, чтобы я мог запускать модули независимо от основной программы, которая их требует.
Структура каталогов выглядит примерно так:
.
├── incl
│ ├── __init__.py
│ ├── module_1.py
│ └── module_2.py
├── __init__.py
└── main_program.py
module_2
нужен код от module_1
и main_program
нужен код от module_2
.
Если я настрою его так:
▶ cat main_program.py
import incl.module_2
▶ cat incl/module_1.py
f = None
▶ cat incl/module_2.py
from module_1 import f
Я не могу запустить python main_program.py
, но я могу запустить python incl/module_2.py
:
▶ python main_program.py
Traceback (most recent call last):
File "main_program.py", line 1, in <module>
import incl.module_2
File "/home/lo-pilno/Dropbox/python/moduleimportbs/incl/module_2.py", line 1, in <module>
from module_1 import f
ModuleNotFoundError: No module named 'module_1'
Если я настрою это так:
▶ cat main_program.py
import incl.module_2
▶ cat incl/module_1.py
f = None
▶ cat incl/module_2.py
from . module_1 import f # <- this line changed
Оно перевернуто. Теперь я могу запустить python main_program.py
, но больше не python incl/module_2.py
▶ python incl/module_2.py
Traceback (most recent call last):
File "incl/module_2.py", line 1, in <module>
from . module_1 import f
ModuleNotFoundError: No module named '__main__.module_1'; '__main__' is not a package
Как правильно настроить это так, чтобы оба случая работали?
Я потратил час на изучение этого и аналогичные вопросы, кстати. Я до сих пор не понимаю, как это сделать.