Что такое очень * простой * способ структурирования проекта Python?
Таким образом, у меня есть эта вещь Python, которая должна обработать файл.
Сначала это было:
my_project/
├── script.py
И я бы просто запустить его с python script.py file.csv
,
Тогда это выросло и стало:
my_project/
├── script.py
├── util/
│ └── string_util.py
├── services/
│ └── my_service.py
(Там пусто __init__.py
в каждом каталоге)
Но сейчас my_service.py
хотел бы использовать string_util.py
и это так чертовски непросто, как сделать это красиво.
Я хотел бы сделать from ..util import string_util
в my_service.py
(который импортируется в script.py
с from services import my_service
), но это не работает с python script.py
поскольку my_service
"s __name__
только тогда services.my_service
(и я получаю Attempted relative import beyond toplevel package
)
я могу сделать
cd ..
а такжеpython -m my_project.script
, но это кажется настолько неестественным, и было бы очень плохо поместить его в README для инструкций, как запустить это.Прямо сейчас я решаю это с уродливым
sys.path.append()
хак.
Какие еще варианты у меня есть?
1 ответ
Это граничит с мнением, но я поделюсь своим мнением по этому вопросу.
Вы должны посмотреть на свой проект по-другому. Выберите одну точку выполнения и укажите ссылку на ваш импорт, чтобы избежать всех нечетных относительных импортов, которые вы пытаетесь обойти. Итак, глядя на структуру вашего проекта:
my_project/
├── script.py
├── util/
│ └── string_util.py
├── services/
│ └── my_service.py
Как вы сейчас делаете, выполняйте свой код изнутри my_project
, Таким образом, весь ваш импорт должен соответствовать этой точке. Поэтому ваш импорт на самом деле выглядит так:
# my_service.py
from util.string_util import foo
Еще один способ подумать об этом: если вы перемещаете свой проект или имеете CI, вам нужно обязательно указать, из какого корневого каталога проекта вы хотите выполнить. Помня об этих вещах и указав единственную точку исполнения, в которой должен быть выполнен ваш проект, вы значительно упростите свою жизнь, когда речь заходит о структурировании ваших пакетов и модулей и соответствующих ссылках на них, позволяя другим системам правильно использовать ваш проект. без необходимости иметь дело с нечетным относительным импортом.
Надеюсь это поможет.