Модуль импортирует другой модуль косвенно, но не напрямую - PullRequest
0 голосов
/ 16 января 2020

У меня проблемы с пониманием того, как import, абсолютный и относительный, работает в Python.

Я воспроизведу свой рабочий каталог и для краткости опущу некоторые файлы:

A/
  B/
  __init__.py
  main.py
  C/
    __init__.py
    module1.py
    module2.py

main.py необходимо f1 и f2 с module1.py. module1.py нужно f3 из module2.py.

После того, как я поработал и прочитал документацию, мне удалось импортировать функции в мой файл main.py из моего файла module1.py. Внутри main.py мне пришлось сделать следующее:

from .C.module1 import f1, f2.

module1.py зависит от функций из module2.py. Это тривиально: внутри module1.py:

from module2 import f3.

Таким образом, я могу позвонить module1.py напрямую, и он загрузит f3; однако в моем файле main.py (кстати, Flask) он не загружается, потому что module1.py выдает ModuleNotFoundError: No module named 'module2'. Я думаю, что это связано с тем, что я сейчас в другом каталоге. В любом случае, если в module1.py я изменю from module2 import f3 на from .module2 import f3, main.py будет работать, но тогда я не могу вызвать файл module1.py напрямую, потому что он вызовет исключение ModuleNotFoundError: No module named '__main__.module2'; '__main__' is not a package.

РЕДАКТИРОВАТЬ : случайно поменялись именами.

Обратите внимание, что у меня есть __init__.py в обоих каталогах / пакетах. Что я должен сделать, чтобы оба main.py и module1.py работали?

1 Ответ

1 голос
/ 16 января 2020
test
├── C
│   ├── __init__.py
│   ├── module1.py
│   └── module2.py
└── main.py

test/main.py

from C import f1, f2, call_f3

print(f1())
print(f2())
print(call_f3())

test/C/module1.py

from .module2 import f3

def f1():
    return "f1()"

def call_f3():
    return "called " + f3()

test/C/module2.py

def f2():
    return "f2()"


def f3():
    return "f3()"

test/C/__init__.py

Это то, что позволяет нам делать from C import f1, f2, call_f3 в main.py.

from .module1 import f1, call_f3
from .module2 import f2

Вывод main.py

f1()
f2()
called f3()
...