Как организовать проект Python? - PullRequest
70 голосов
/ 01 марта 2011

Я новичок в Python и запускаю мини-проект, но у меня есть некоторые сомнения по поводу того, как организовать папки в "Python Way".

Я использую PyDev вмоя среда разработки, и когда я создаю новый проект, создается папка с именем src

+ src

Теперь в PyDev я могу создавать Pydev Module и PyDev Package

Мне нужно организовать свой проект следующим образом:

+ Indicators
    - Moving_averages.py
    - Stochastics.py
+ Strategies
    - Moving_averages_cross.py
- example.py

Как я могу организовать это с точки зрения модулей и пакетов?Что означает Модули и Пакеты?

С наилучшими пожеланиями,

Ответы [ 8 ]

43 голосов
/ 01 марта 2011

Пакет - это, в основном, папка с файлом __init__.py и обычно с некоторыми модулями, где модуль - это файл *.py.В основном это связано с import.Если вы добавите __init__.py к индикаторам, вы можете использовать:

from Indicators.Stochastics import *

или

from Indicators import Stochastics

Кстати, я бы рекомендовал оставлять имена модулей / пакетов строчными.Это не влияет на функциональность, но более "питонно".

36 голосов
/ 01 марта 2011

С точки зрения файловой системы module - это файл, заканчивающийся .py, а package - это папка, содержащая module s и (вложенные) package s. Python распознает папку как package, если она содержит файл __init__.py.

Файловая структура, подобная этой

some/
    __init__.py
    foofoo.py
    thing/
        __init__.py
        barbar.py

определяет package some, который имеет module foofoo и вложенный пакет thing, который снова имеет модуль barbar. Однако при использовании пакетов и модулей вы на самом деле не различаете эти два типа:

import some

some.dothis() # dothis is defined in 'some/__init__.py'

import some.foofoo # <- module
import some.thing # <- package

Пожалуйста, следуйте PEP8 при выборе именования ваших пакетов / модулей (т.е. используйте имена в нижнем регистре).

26 голосов
/ 23 января 2013

См. python-package-template

Структура каталогов

    .
    |-- bin
    |   `-- my_program
    |-- docs
    |   `-- doc.txt
    |-- my_program
    |   |-- data
    |   |   `-- some_data.html
    |   |-- __init__.py
    |   |-- submodule
    |   |   `-- __init__.py
    |   |-- helpers.py
    |-- tests
    |   |-- __init__.py
    |   |-- test_helpers.py
    |-- Makefile
    |-- CHANGES.txt
    |-- LICENSE.txt
    |-- README.md
    |-- requirements-dev.txt
    |-- requirements.txt
    `-- setup.py

cat Makefile

    PYTHON=`which python`
    NAME=`python setup.py --name`


    all: check test source deb

    init:
        pip install -r requirements.txt --use-mirrors

    dist: source deb

    source:
        $(PYTHON) setup.py sdist

    deb:
        $(PYTHON) setup.py --command-packages=stdeb.command bdist_deb

    rpm:
        $(PYTHON) setup.py bdist_rpm --post-install=rpm/postinstall --pre-uninstall=rpm/preuninstall

    test:
        unit2 discover -s tests -t .
        python -mpytest weasyprint

    check:
        find . -name \*.py | grep -v "^test_" | xargs pylint --errors-only --reports=n
        # pep8
        # pyntch
        # pyflakes
        # pychecker
        # pymetrics

    clean:
        $(PYTHON) setup.py clean
        rm -rf build/ MANIFEST dist build my_program.egg-info deb_dist
        find . -name '*.pyc' -delete
13 голосов
/ 01 марта 2011

Возможно, вы захотите проверить библиотеку modern-package-template.Он предоставляет способ настроить действительно хороший базовый макет для проекта, который проведет вас через несколько вопросов и попытается помочь вам получить то, что можно распространять довольно легко.

http://pypi.python.org/pypi/modern-package-template

7 голосов
/ 28 сентября 2015

Прежде чем принять решение о структуре проекта, хорошо спросить себя, какова будет цель проекта. Это будет один анализ? Игрушечная концепция, которую вы хотите исследовать? Полномасштабный проект, который вы собираетесь распространять? Количество усилий, которое вы хотите приложить к структурированию вашего проекта, будет другим.

  • Если это разовый анализ, мне нравится использовать ноутбуки ipython . Записная книжка уловит поток ваших мыслей, и вы можете добавлять заметки в разметке к своему коду для дальнейшего использования.
  • Если вы хотите исследовать игрушечную концепцию, я найду простой и быстрый подход, чтобы лучше всего работать. Вы хотите иметь возможность быстро реализовать свою концепцию, чтобы выяснить, является ли она осуществимой и, следовательно, стоит потратить на нее больше времени. Часть философии Python гласит: «Не пытайтесь достичь совершенства, потому что« достаточно хорошо »часто является именно этим». Вы всегда можете вернуться позже и структурировать свой проект в соответствии с лучшими практиками разработки программного обеспечения.
  • Если вы хотите структурировать свой проект, чтобы потом можно было его распространить и, чтобы он масштабировался на множество модулей, я рекомендую следующую структуру:

    projectname
     ├── MANIFEST.in
     ├── setup.py
     ├── README
     ├── .gitignore
     ├── .git
     ├── projectname_env
     └── projectname
         ├── __init__.py
         ├── subpackageone
         │   ├── __init__.py
         │   ├── second_module.py
         │   ├── tests
         │   │   └── test_second_module.py
         │   └── models
         │       └── model1
         ├── first_module.py   
         └── tests
             └── test_second_module.py
    

Подробные причины, по которым мне нравится эта структура , есть в моем блоге , но основная суть в том, что в иерархически низкоуровневом каталоге projectname содержится ваш реальный проект. Наряду с этим есть все инструменты, которые помогают управлять (git) и упаковывать (setup.py, MANIFEST.in) его.

4 голосов
/ 01 марта 2011

Пакет - это каталог с __init__.py в нем.Отличие от каталога заключается в том, что вы можете импортировать его.

Сам по себе «пути Python» не существует, но вы обнаружите, что было бы неплохо поместить все ваши модули в один пакет симя, связанное с проектом.

Кроме того, чтобы следовать руководству по стилю Python, PEP8, имена пакетов и модулей должны быть строчными.Итак, если мы предположим, что проект называется «Статистика по бондам», ваша структура будет выглядеть примерно так:

botondstats/
    indicators/
        moving_averages.py
        stochastics.py
    strategies/
        moving_averages_cross.py
    example.py

Затем вы найдете класс Stochastics, выполнив

from botondstats.indicators.stochastics.Stochastics

(тамСуществуют различные способы сохранить структуру, но сделать импорт короче, но это другой вопрос).

Вы можете поместить эту структуру в src/, если хотите, но это не обязательно.Я никогда не делаю.Вместо этого у меня есть главный каталог:

BotondStatistics/
    docs/
    botonstats/ # the above structure
    setup.py    # Distutils/distribute configuration for packaging.

В этом каталоге у меня также обычно есть virtualenv, поэтому у меня фактически есть bin / lib / et al.Разработка обычно выполняется с помощью

./bin/python setup.py tests

Поскольку я использую средство запуска Distrubute для запуска тестов.

Вот как я это делаю.: -)

3 голосов
/ 18 марта 2014

Попробуйте python_boilerplate_template:

https://pypi.python.org/pypi/python_boilerplate_template

1 голос
/ 10 апреля 2017

Проект cookiecutter audreyr включает несколько шаблонов проектов Python:

В пакете используется один~/.cookiecutterrc файл для создания пользовательских шаблонов проектов на Python, Java, JS и других языках.

Например, шаблон Python, совместимый с PyPI:

cookiecutter-pypackage

...