Jak zorganizować projekt Pythona?

Jestem nowy w Pythonie i zaczynam projekt mini. ale mam pewne wątpliwości, jak zorganizować foldery w "sposób Pythona".

Używam PyDev w moim środowisku programistycznym, a kiedy tworzę nowy projekt, tworzony jest folder o nazwie "src"

+ src

Teraz w PyDev mogę utworzyć "Pydev Module "i"PyDev Package"

Muszę zorganizować mój projekt w następujący sposób:

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

Jak mogę to zorganizować w kategoriach modułów i pakietów? Co to jest znaczenie modułów i pakietów?

Pozdrawiam,

Author: Josh C, 2011-03-01

8 answers

Pakiet jest w zasadzie folderem zawierającym plik __init__.py i zazwyczaj niektóre moduły, gdzie moduł jest plikiem *.py. Ma to głównie związek z import. Jeśli dodasz __init__.py do wskaźników możesz użyć:

from Indicators.Stochastics import *

Lub

from Indicators import Stochastics

Przy okazji, zalecałbym, aby nazwy modułów/pakietów były pisane małymi literami. Nie wpływa to na funkcjonalność, ale jest bardziej "pythoniczny".

 39
Author: Botond Béres,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-01 13:47:49

Z punktu widzenia systemu plików, moduł jest plikiem kończącym się na .py, A Pakiet jest folderem zawierającym ponownie moduły i (zagnieżdżone) Pakiety. Python rozpoznaje folder jako pakiet, jeśli zawiera plik __init__.py.

Taka struktura plików

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

Definiuje pakiet some, który ma moduł foofoo i zagnieżdżony pakiet thing, który ponownie ma moduł barbar. Jednak podczas korzystania z Pakietów i modułów nie rozróżnia się tych dwóch rodzaje:

import some

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

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

Proszę postępować zgodnie z PEP8 podczas wybierania nazw pakietów/modułów(np. używaj nazw małych liter).

 35
Author: Oben Sonne,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-01 13:49:35

Zobacz python-package-template

Struktura katalogów

    .
    |-- 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
 26
Author: Vitaly Fadeev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-23 04:06:57

Możesz sprawdzić bibliotekę modern-package-template. Zapewnia sposób na skonfigurowanie naprawdę ładnego podstawowego układu dla projektu, który przeprowadzi Cię przez kilka pytań i stara się pomóc ci uzyskać coś, co jest w stanie być dystrybuowane dość łatwo.

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

 13
Author: Rick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-01 14:43:49

Przed podjęciem decyzji o strukturze projektu, warto zadać sobie pytanie, jaki będzie cel projektu. Czy to będzie jednorazowa analiza? Pomysł na zabawkę, który chcesz zbadać? Pełny projekt, który zamierzasz rozpowszechniać? Ilość wysiłku, który chcesz włożyć w strukturyzację projektu, będzie inna.

  • jeśli jest to analiza Jednorazowa, lubię używać notebooków ipython . Notatnik uchwyci przepływ twoich myśli i możesz dodawać notatki w znaczniki do kodu w celu późniejszego odniesienia.
  • jeśli chodzi o koncepcję zabawek, którą chcesz zbadać, znajduję proste, szybkie podejście do pracy najlepiej. Chcesz być w stanie szybko wdrożyć swoją koncepcję, aby dowiedzieć się, czy jest ona w ogóle wykonalna, a tym samym warto poświęcić na nią więcej czasu. Częścią filozofii Pythona jest "nie próbuj dążyć do perfekcji, ponieważ" wystarczająco dobry " jest często tylko tym."Zawsze możesz wrócić później i uporządkować swój projekt w sposób zgodny z najlepszą inżynierią oprogramowania praktyki.
  • Jeśli chcesz uporządkować swój projekt tak, aby można go później dystrybuować i tak, aby skalował się do wielu modułów, polecam następującą strukturę:

    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
    

Szczegółowe powody, dla których lubię tę strukturę są w moim poście na blogu, ale podstawowym gist jest to, że hierarchicznie niższy poziom projectname katalog zawiera Twój rzeczywisty projekt. Obok niego znajdują się wszystkie narzędzia wspomagające zarządzanie (git) i pakiet (setup.py, MANIFEST.in) it.

 6
Author: Alexander,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-28 17:42:46

Pakiet jest katalogiem z __init__.py w nim. Różnica w stosunku do katalogu polega na tym, że można go zaimportować.

Nie ma "sposobu Pythona" jako takiego, ale przekonasz się, że dobrym pomysłem jest umieszczenie wszystkich modułów w jednym pakiecie o nazwie związanej z projektem.

Ponadto, aby postępować zgodnie z przewodnikiem po stylu Pythona, PEP8, nazwy pakietów i modułów powinny być pisane małymi literami. Jeśli więc założymy, że projekt nazywa się "Botond Statistics", twoja struktura będzie czymś w rodzaju to:

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

Następnie znajdziesz klasę Stochastyki wykonując

from botondstats.indicators.stochastics.Stochastics

(istnieją różne sposoby na utrzymanie struktury, ale skrócenie importu, ale to inne pytanie).

Możesz umieścić tę strukturę pod src/, jeśli chcesz, ale nie jest to konieczne. Nigdy tego nie robię. Zamiast tego mam katalog główny:

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

W tym katalogu zazwyczaj mam virtualenv więc mam też bin / lib / et al. Rozwój odbywa się zazwyczaj przez running

./bin/python setup.py tests

Ponieważ używam Distrubute test runner do wykonywania testów.

Tak to robię. :-)
 4
Author: Lennart Regebro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-01 13:57:02
 3
Author: KT.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-20 02:31:41

The cookiecutter project by audreyr zawiera kilka szablonów projektów Pythona:

Pakiet używa pojedynczego pliku ~/.cookiecutterrc do tworzenia niestandardowych szablonów projektów w Pythonie, Javie, JS i innych językach.

Na przykład szablon Pythona zgodny z PyPI:

cookiecutter-pypackage

 1
Author: Anton Tarasenko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-10 14:08:58