Моя структура проекта выглядит следующим образом
project_name/
project_name/
__init__.py
sub_package1/
__init__.py
some_module1.py
sub_package2/
__init__.py
some_module2.py
scripts/
some_script.py
notebooks/
some_notebook.py
top level files <requirements.txt, .gitignore, README.md, ...>
Теперь я хочу, чтобы в моих скриптах на Python внутри папки скриптов и в моих тетрадях внутри папки тетрадей был доступ к моей основной библиотеке как
from project_name.sub_package1 import some_module1
Каков наилучший способ достичь этого?
Некоторые идеи, которые я придумал:
1)
В папке с моим блокнотом создайте файл context.py с содержимым
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
Тогда в своих тетрадях я могу сделать
from context import project_name
и работать с этого момента. Это нормально, но, конечно, было бы лучше иметь возможность напрямую импортировать имя_проекта без контекста в моей записной книжке.
2)
В записной книжке выполните
notebook_dir = os.path.split(os.getcwd())[0]
if notebook_dir not in sys.path:
sys.path.insert(0, notebook_dir)
, так как файл dunder не существует в интерактивной оболочке. Здесь я не совсем уверен, что произойдет, если я где-нибудь поменяю диск и, в конце концов, иметь этот беспорядок в начале моего ноутбука несколько нежелательно.
3)
Добавьте корневую папку имя_проекта в путь к Python. Если это можно сделать не жестко закодированным способом, это было бы здорово. Я использую pyenv и pyenv virtualenv.
Спасибо за ваши предложения,
Matt