Как организовать проект Python?

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

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

+ src

Теперь, в PyDev, я могу создать "модуль Pydev" и "пакет PyDev"

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

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

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

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

Ответ 1

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

from Indicators.Stochastics import *

или

from Indicators import Stochastics

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

Ответ 2

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

Структура файла, подобная этому

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

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

import some

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

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

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

Ответ 3

См. 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

Ответ 4

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

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

Ответ 5

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

  • Если это один анализ, мне нравится использовать ipython notebooks. Блокнот будет захватывать поток ваших мыслей, и вы можете добавлять примечания в разметку к вашему коду для последующей справки.
  • Если это концепция игрушек, которую вы хотите исследовать, я нахожу простой и быстрый подход к лучшему. Вы хотите иметь возможность быстро реализовать свою концепцию, чтобы узнать, возможно ли это, и, следовательно, стоит потратить на нее больше времени. Часть философии 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).

Ответ 6

Пакет представляет собой каталог с __init__.py в нем. Отличие от каталога состоит в том, что вы можете импортировать его.

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

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

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

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

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 для запуска тестов.

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

Ответ 8

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

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

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

cookiecutter-pypackage