Заставить пути импорта работать для автономного запуска модуля, а также строго как импорт - PullRequest
0 голосов
/ 04 апреля 2020

Я борюсь с настройкой импорта в пакет таким образом, чтобы я мог запускать модули независимо от основной программы, которая их требует.

Структура каталогов выглядит примерно так:

.
├── 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

Как правильно настроить это так, чтобы оба случая работали?

Я потратил час на изучение этого и аналогичные вопросы, кстати. Я до сих пор не понимаю, как это сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...