Як організувати проект Python?


76

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

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

+ src

Тепер, у PyDev, я можу створювати Pydev ModuleіPyDev Package

Мені потрібно організувати свій проект таким чином:

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

Як я можу це організувати з точки зору модулів та пакетів? Що означає модулі та пакети?

З найкращими побажаннями,


1
Я можу порекомендувати це посилання з офіційного підручника з Python . Це досить ясно і прямо вперед.
LiorK

Зовсім недавня корисна публікація: Правильно розпочати проект на
пітоні

Відповіді:


49

Пакет - це, в основному, папка з __init__.pyфайлом під нею та, як правило, деякі Модулі, де Модуль - це *.pyфайл. Це пов’язано importголовним чином. Якщо ви додасте __init__.pyдо показників, ви можете використовувати:

from Indicators.Stochastics import *

або

from Indicators import Stochastics

До речі, я б рекомендував зберігати імена модулів / пакетів у нижньому регістрі. Це не впливає на функціональність, але це більш "пітонічно".


40

З точки зору файлової системи, модуль - це файл, який закінчується на, .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, вибираючи імена ваших пакетів / модулів (тобто використовуйте імена з малими літерами).


2
Чи можу я викликати функцію з, foofoo.pyякщо я лише імпортую деякі? Мене бентежить те __init__.py, що мені туди покласти?
Jay Wong

27

Див. Шаблон python-package

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

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

кішка 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

2
привіт, Віталію! Я щойно натрапив на ваш проект. Ви все ще підтримуєте його? Дякую!
Еліас Дорнелес

2
Закінчився 404
Dimitrios Mistriotis

2
Посилання https://github.com/vital-fadeev/python-package-templateбільше не діє. Де можна знайти цей шаблон python-package?
Зубочистка Анемона

14

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

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


8

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

  • Якщо це одноразовий аналіз, я люблю користуватися зошитами 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) ним.


Як би ви керували своїм проектом? У кореневій папці робиш python3 -m projectname?
buhtz

4

Пакет - це каталог, у якому є __init__.py. Відмінність від каталогу полягає в тому, що ви можете імпортувати його.

Сам по собі не існує "способу Python", але ви виявите, що непогано розмістити всі свої модулі в одному пакеті з ім'ям, пов'язаним з проектом.

Крім того, щоб слідувати керівництву стилем Python, PEP8, імена пакетів та модулів повинні бути малими. Отже, якщо ми припустимо, що проект називається "Статистика Botond", ваша структура буде приблизно такою:

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

Ось як я це роблю. :-)



1

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

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

Наприклад, шаблон Python, сумісний з PyPI:

cookiecutter-pypackage

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.