Что такое очень * простой * способ структурирования проекта 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, вам нужно обязательно указать, из какого корневого каталога проекта вы хотите выполнить. Помня об этих вещах и указав единственную точку исполнения, в которой должен быть выполнен ваш проект, вы значительно упростите свою жизнь, когда речь заходит о структурировании ваших пакетов и модулей и соответствующих ссылках на них, позволяя другим системам правильно использовать ваш проект. без необходимости иметь дело с нечетным относительным импортом.

Надеюсь это поможет.

Другие вопросы по тегам