Существуют различные подходы к этому, будь то один или другой лучше зависит на том, как вы хотите развить, использование пакета (например, если вы когда-либо установить его с помощью pip install -e packag_name
) и т.д.
Что отсутствует из вашего дерева имя каталога, в котором setup.py
проживает, и это, как правило, имя пакета:
└── package
├── package
│ ├── __init__.py
│ ├── module_one.py
│ ├── module_three.py
│ └── module_two.py
├── MANIFEST.in
├── README.rst
├── setup.cfg
└── setup.py
, как вы можете видеть, вы удвоению название «пакета», и это означает, что ваш setup.py
должен быть адаптирован для каждой упаковки или динамически определять имя t где находится файл module.py
. Если вы поедете по этому маршруту, я предлагаю вам поместить файлы module.py
в общую папку с именем 'src' или 'lib'.
Я не люблю выше «стандартного» установки по нескольким причинам:
это не карта хорошо к тому, как программы питона «растут», прежде чем они будут разбиты на пакеты. Перед раскалывается имея такой каталог «Src» означает использование:
from package.src.module_one import MyModuleOneClass
Вместо этого вы бы ваши module.py
файлы непосредственно под package
- Имея
setup.py
контролировать установку, README.rst
документации и __init__.py
к удовлетворить импорт Python - это одно, но все остальное, кроме ваших файлов module.py
, содержащих фактическую функциональность, является мусором. Мусор, который может понадобиться в какой-то момент во время процесса создания пакета, но не нужен для функциональности пакета.
Есть и другие соображения, такие, как возможность получить доступ к номеру версии пакета из setup.py
, а также из программы, без первой необходимости импортировать сам пакет (который может привести к установке осложнений) , а также дополнительный файл version.py
, который нуждается в импорте.
В частности, я всегда находил переход от использования структуры каталогов под сайт-пакеты, которые выглядели как:
└── organisation
├── package1
└── package2
├── subpack1
└── subpack2
и которые могут интуитивно быть использованы как для импортирующих и навигации к исходным файлам, к чему-то вроде:
├── organisation_package1
│ └── src
├── organisation_package2_subpack1
│ └── src
└── organisation_package2_subpack2
└── src
неестественный. Переупорядочить и сломать рабочую структуру, чтобы иметь возможность упаковывать вещи, кажется неправильным.
Для моего набора опубликованных пакетов я следовал по-другому: - Я сохранил структуру естественного дерева, которую вы можете использовать в каталогах «перед упаковкой», «src» или «lib». - У меня есть общий setup.py
, который читает и анализирует (он делает не импорт) метаданные (такие как номер версии, имя пакета, информация о лицензии, установить ли утилиту (и ее название)) из словаря в __init__.py
файл. В любом случае вам нужен файл. - setup.py
достаточно умен, чтобы различать подкаталоги, содержащие другие пакеты, из подкаталогов, которые являются частью родительского пакета. - setup.py генерирует файлы, которые необходимы только при генерации пакета (например, setup.cfg
), и удаляет их, когда они больше не нужны.
выше позволяет иметь вложенные пакеты пространств имён (т.е. package2
может быть пакет, который вы загрузить на PyPI, в дополнение к package2.subpack1
и package2.subpack2
). Главное, что он (в настоящее время) не разрешает использовать pip install -e
, чтобы отредактировать один пакет (а другие не доступны для редактирования). Учитывая то, как я развиваюсь, это не ограничение.
выше охватывает пространства имен пакетов, где многие другие подходы имеют проблемы с этим (помните последнюю строку дзен Python: Пространства имен одна гудение отличная идея - давайте больше тех)
примеров из выше может быть, например, найти в моих пакетах ruamel.yaml
(и, например, ruamel.yaml.cmd
), или в общем путем поиска PyPi для ruamel.
Как, вероятно, очевидно, стандартная оговорка: я автор из этих пакетов
Поскольку я использую утилиту для запуска упаковки, которая также запускает тесты и выполняет другие проверки на работоспособность, общий код setup.py
может быть удален из установки и вставлен в эту утилиту. Но так как обнаружение подпакетов основано на доступности setup.py
, это требует некоторой доработки общего setup.py
.
Спасибо Anthon, это много, чтобы окунуться в мою голову, но я просмотрел ваш репортаж битбакет и могу видеть, как он работает. Вопрос, хотя для моей ситуации будет только один пакет для установки, и никаких подпакетов.Мое понимание вашей модели заключается в том, что у меня будет один каталог («пакет») со всем под ним (и без подпапок, кроме _doc и _test и т. Д.) –
Поскольку вы указали, что у вас есть шаблон, я думал, что вы вовлечены в несколько пакетов. Для одного пакета, который поступит в PyPI, вам не нужен шаблон. Вы все равно можете использовать мой 'setup.py' даже без подпакетов (или нескольких пакетов), но это не так сильно окупится. Если у вас больше вопросов, задайте здесь или отправьте мне электронное письмо (вы можете найти это через профиль). – Anthon
Спасибо Anthon, извините, что я не сделал этого ясно в первую очередь. У меня действительно есть три пакета, которые я разрабатываю, но они в значительной степени не связаны, поэтому я буду держать их отдельно. Как вы думаете, я нахожусь на правильном пути с тем, как я намерен пользователям взаимодействовать с пакетом, в соответствии с примерами в моем вопросе? –