Я разрабатываю структуру python и хочу делать импорт на основе пакета верхнего уровня (название проекта). Пользователи будут использовать фреймворк, скопировав всю структуру и создав собственные модули.
Моя текущая структура выглядит следующим образом:
myapp/
config.py
docs/
framework/
main.py
utils.py
file.py
lib/
some_module.py
unit_tests/
test_utils.py
Я хочу иметь возможность использовать следующий импорт в файлах python в lib и unit_tests следующим образом:
from myapp.framework import utils
Есть ли простой способ сделать это? Я пробовал делать sys.path.append() хаки, но они действительно не работают. Если есть действительно питонический способ достичь этого, я не против идти на дополнительные длины, чтобы заставить его работать.
EDIT: Ну, я снова попробовал sys.path.append(), и это действительно работает, но это действительно элегантное решение, и я действительно хотел бы услышать, есть ли другой способ.
Короче: вы не можете иметь два модуля с тем же именем один внутри другого. У вас есть папка myapp
и файл myapp.py
Это из-за порядка импорта модулей.
Итак, если вы пытаетесь import myapp.lib.some_module
в config.py, интерпретатор сначала увидит, что у вас есть myapp.py в той же папке и буквально попробуйте импортировать lib.some_module
из этого файла, чего не существует.
Будет ли что-то пытаться импортировать myapp.myapp.lib.some_module
извне этого модуля.
Итак, самое лучшее, что вам нужно сделать, это переименовать файл myapp.py
В чем проблема? Это стандартный пакет, и это должно работать из коробки? Почему вы хотите что-либо с помощью sys.path.append() здесь? Сделайте свой материал подходящим пакетом Python с его собственным setup.py, установите и разверните его правильно и используйте его, как и любой другой пакет.... где ваша РЕАЛЬНАЯ проблема???? И что "пользователи будут использовать фреймворк, копируя всю структуру и записывая свои собственные модули внутри". имею в виду? Пользователь должен установить пакет правильно, как и все остальные, с помощью easy_install, pip или распространения. Вот почему у нас есть эти инструменты.
sys.path.append()
?