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

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

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

+ src

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

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

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

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

С Уважением,

8 ответов


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

from Indicators.Stochastics import *

или

from Indicators import Stochastics

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


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

такая файловая структура

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 при выборе именования пакетов / модулей (т. е. использовать имена в нижнем регистре).


посмотреть python-пакет-шаблон

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

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

кошки make-файл

    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

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

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


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

  • если это один анализ, я хотел бы использовать оболочкой 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
    

подробные причины, почему мне нравится эта структура в своем блоге, но основная суть в том, что иерархически более низкий уровень


пакет-это каталог с __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

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

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


попробовать python_boilerplate_template:

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


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

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

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

cookiecutter-pypackage