Представьте, что вы хотите разработать нетривиальное настольное (не веб) приложение для конечного пользователя на Python. Каков наилучший способ структурировать иерархию папок проекта?
Желаемыми функциями являются простота обслуживания, удобство IDE, пригодность для ветвления / слияния управления исходным кодом и простота создания инсталляционных пакетов.
В частности:
- Где вы положили источник?
- Где вы размещаете сценарии запуска приложения?
- Куда вы кладете проект IDE?
- Где вы положили блок / приемочные испытания?
- Где вы размещаете не-Python данные, такие как файлы конфигурации?
- Где вы размещаете не-Python исходники, такие как C ++ для бинарных модулей расширения pyd / so?
Согласно структуре файловой системы Жан-Поля Кальдероне проекта Python :
источник
Project/project/
? Ах, второе имя пакета.../
включение оператора)pip install -e /path/to/Project
)-e
флаг, который устанавливает пакет как редактируемый пакет, то есть устанавливает его как ссылки на фактическую папку проекта. Исполняемый файл может простоimport project
иметь доступ к модулю.Этот пост в блоге Жана-Пола Кальдероне обычно дается в качестве ответа в #python на Freenode.
источник
Проверьте Open Sourcing Python Project правильный путь .
Позвольте мне извлечь часть макета проекта из этой превосходной статьи:
источник
Makefile
на тот же уровень, что иsetup.py
? Так что, если я вас правильно понял,make env
автоматизирует создание новогоvenv
и установит в него пакеты ...?У "Python Packaging Authority" есть пример проекта:
https://github.com/pypa/sampleproject
Это пример проекта, который существует в качестве пособия к Руководству пользователя Python Packaging по проектам упаковки и распространения.
источник
root/src/*
структуре: github.com/pypa/sampleproject/commit/…Попробуйте запустить проект, используя шаблон python_boilerplate . Он во многом соответствует лучшим практикам (например, здесь ), но лучше подходит, если вы захотите разделить свой проект на несколько яиц в какой-то момент (и, поверьте мне, с любыми проектами, кроме самых простых, вы это сделаете). Распространенная ситуация, когда вы должны использовать локально-модифицированную версию чужой библиотеки).
Где вы положили источник?
PROJECT_ROOT/src/<egg_name>
.Где вы размещаете сценарии запуска приложения?
entry_point
один из яиц.Куда вы кладете проект IDE?
PROJECT_ROOT/.<something>
корне проекта, и это нормально.Где вы положили блок / приемочные испытания?
PROJECT_ROOT/src/<egg_name>/tests
каталоге. Я лично предпочитаю использовать ихpy.test
для запуска.Где вы размещаете не-Python данные, такие как файлы конфигурации?
pkg_resources
пакет изsetuptools
, или начиная с Python 3.7 черезimportlib.resources
модуль из стандартной библиотеки.PROJECT_ROOT/config
. Для развертывания могут быть различные варианты. В Windows можно использовать%APP_DATA%/<app-name>/config
, в Linux/etc/<app-name>
или/opt/<app-name>/config
.PROJECT_ROOT/var
время разработки, так и/var
во время развертывания Linux.PROJECT_ROOT/src/<egg_name>/native
Документация обычно включается
PROJECT_ROOT/doc
илиPROJECT_ROOT/src/<egg_name>/doc
(это зависит от того, считаете ли вы некоторые яйца отдельными крупными проектами). Некоторые дополнительные настройки будут в таких файлах, какPROJECT_ROOT/buildout.cfg
иPROJECT_ROOT/setup.cfg
.источник
base_data_location
переменная, но как вы ее правильно установите?По моему опыту, это просто вопрос итерации. Размещайте свои данные и код там, где, по вашему мнению, они идут. Скорее всего, вы все равно будете неправы. Но как только вы получите лучшее представление о том, как все будет складываться, вы будете в гораздо лучшем положении, чтобы делать подобные предположения.
Что касается источников расширений, у нас есть каталог Code в trunk, который содержит каталог для python и каталог для различных других языков. Лично я в следующий раз больше склонен пытаться поместить любой код расширения в свой собственный репозиторий.
С учетом сказанного я возвращаюсь к своей исходной точке: не делайте из этого слишком большой сделки. Поместите это где-нибудь, что, кажется, работает для Вас. Если вы найдете что-то, что не работает, это можно (и нужно) изменить.
источник
Данные, не относящиеся к Python, лучше всего объединять в ваших модулях Python, используя
package_data
поддержку в setuptools . Я настоятельно рекомендую использовать пакеты пространств имен для создания общих пространств имен, которые могут использовать несколько проектов - во многом как соглашение Java о размещении пакетовcom.yourcompany.yourproject
(и возможность иметь общееcom.yourcompany.utils
пространство имен).Повторное ветвление и слияние, если вы используете достаточно хорошую систему контроля версий, она будет обрабатывать слияния даже через переименования; Базар особенно хорош в этом.
В отличие от некоторых других ответов здесь, я +1 от наличия
src
каталога верхнего уровня (сdoc
иtest
каталогами рядом). Конкретные соглашения для деревьев каталогов документации будут варьироваться в зависимости от того, что вы используете; Sphinx , например, имеет свои собственные соглашения, которые поддерживает его инструмент быстрого запуска.Пожалуйста, пожалуйста, используйте setuptools и pkg_resources; это значительно упрощает использование другими проектами определенных версий вашего кода (и одновременную установку нескольких версий с разными файлами, не относящимися к коду, если вы используете
package_data
).источник