#python #git
#python #git
Вопрос:
У меня есть проект со следующей структурой:
main_model
__init__.py
main.py
second_module
__init__.py
second.py
third_module
__init__.py
third.py
second_module
и third_module
оба подмодуля Git используются в качестве библиотек многими другими проектами.
Первая строка main.py
— это оператор импорта: from main_model.second_module import second
И первая строка second.py
слишком: from second_module.third_module import third
При запуске main.py
возникает ошибка со следующей трассировкой:
Traceback (most recent call last):
File "/main_model/main.py", line 1, in <module>
from main_model.second_module import func_a, func_b
File "/main_model/second_module/second.py", line 1, in <module>
from third_module.third import func_c, func_d
ModuleNotFoundError: No module named 'third_module'
Поэтому, очевидно, мне нужно было бы изменить инструкцию import в second.py
to be from main_model.second_module.third_module import third
. Однако я не могу этого сделать, потому second_module
что это отдельный подмодуль.
Существует ли согласованный способ структурирования импорта или изменения PYTHONPATH, который позволил бы использовать один и тот же синтаксис импорта со всех уровней?
Комментарии:
1. «Однако я не могу этого сделать, потому что second_module — это автономный подмодуль». тогда он должен быть установлен как таковой. Модуль должен каким-то образом находиться на пути.
2. PYHTONPATH должен содержать только верхний, затем выполните абсолютный импорт, т.Е. Из верхних
from main_mode...
или относительныхfrom .second_module.third_module
3. Я пробовал относительный импорт и получаю «ImportError: попытка относительного импорта без известного родительского пакета». @juanpa.arrivillaga Можете ли вы сказать мне, что вы подразумеваете под «установленным как таковым»?
4. @triphook когда вы устанавливаете пакет, например
pip install somelibrary
, который добавляет установленные модули в вашsite-packages
каталог, поэтому вы можетеimport
использовать их из любого места.5. Это не будет установлено, оно будет развернуто в AWS EC2, так что у меня нет такой возможности