it-swarm.com.de

Wie organisiere ich ein Python Projekt?

Ich bin neu in Python und starte ein Mini-Projekt, aber ich habe einige Zweifel, wie die Ordner auf "Python Way" organisiert werden sollen.

Ich verwende PyDev in meiner Entwicklungsumgebung und beim Erstellen eines neuen Projekts wird ein Ordner mit dem Namen src erstellt.

+ src

Nun kann ich in PyDevPydev Module und PyDev Package

Ich muss mein Projekt folgendermaßen organisieren:

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

Wie kann ich dies in Modulen und Paketen organisieren? Was bedeuten Module und Pakete?

Freundliche Grüße,

72
André

Ein Package ist im Grunde ein Ordner mit einer __init__.py - Datei und normalerweise einigen Modulen, wobei Module eine *.py - Datei ist. Es hat hauptsächlich mit import zu tun. Wenn Sie den Indikatoren __init__.py Hinzufügen, können Sie Folgendes verwenden:

from Indicators.Stochastics import *

oder

from Indicators import Stochastics

Übrigens würde ich empfehlen, die Modul-/Paketnamen in Kleinbuchstaben zu halten. Es hat keinen Einfluss auf die Funktionalität, ist aber eher "Pythonic".

46
Botond Béres

Aus Sicht des Dateisystems ist ein module eine Datei, die mit .py Endet, und ein package ist ein Ordner, der module s und (verschachtelt) package ist wieder da. Python erkennt einen Ordner als package, wenn er eine __init__.py - Datei enthält.

Eine solche Dateistruktur

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

definiert das packagesome, das ein modulefoofoo und ein verschachteltes Paket thing enthält, das wiederum ein Modul barbar. Bei der Verwendung von Paketen und Modulen werden diese beiden Typen jedoch nicht wirklich unterschieden:

import some

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

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

Bitte befolgen Sie PEP8 , wenn Sie die Benennung Ihrer Pakete/Module auswählen (d. H. Verwenden Sie Namen in Kleinbuchstaben).

37
Oben Sonne

Siehe python-package-template

Verzeichnisstruktur

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

Vielleicht möchten Sie sich die Bibliothek für moderne Paketvorlagen ansehen. Es bietet die Möglichkeit, ein wirklich nettes Basislayout für ein Projekt einzurichten, das Sie durch ein paar Fragen führt und Ihnen dabei hilft, etwas zu finden, das sich recht einfach verteilen lässt.

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

13
Rick

Bevor Sie sich für eine Projektstruktur entscheiden, sollten Sie sich fragen, welchen Zweck das Projekt haben soll. Wird dies eine einmalige Analyse sein? Ein Spielzeugkonzept, das Sie untersuchen möchten? Ein ausgewachsenes Projekt, das Sie vertreiben möchten? Der Aufwand für die Strukturierung Ihres Projekts ist unterschiedlich.

  • Wenn es sich um eine einmalige Analyse handelt, verwende ich gerne ipython notebooks . Das Notizbuch erfasst den Fluss Ihrer Gedanken und Sie können Ihrem Code Notizen als Markup hinzufügen, um später darauf zurückgreifen zu können.
  • Wenn es sich um ein Spielzeugkonzept handelt, das Sie untersuchen möchten, finde ich einen einfachen und schnellen Ansatz, um am besten zu arbeiten. Sie möchten in der Lage sein, Ihr Konzept schnell umzusetzen, um festzustellen, ob es überhaupt machbar ist und es sich daher lohnt, mehr Zeit darauf zu verwenden. Ein Teil von Pythons Philosophie ist, dass man nicht nach Perfektion strebt, weil "gut genug" oft genau das ist. Sie können später jederzeit wiederkommen und Ihr Projekt auf eine Weise strukturieren, die den besten Methoden der Softwareentwicklung entspricht.
  • Wenn Sie Ihr Projekt so strukturieren möchten, dass Sie es später verteilen können und es sich auf viele Module skalieren lässt, empfehle ich die folgende 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
    

Die detaillierten Gründe, warum ich diese Struktur mag sind in meinem Blog-Post , aber das grundlegende Wesentliche ist, dass das hierarchisch untergeordnete Verzeichnis projectname Ihr aktuelles Projekt enthält. Daneben gibt es alle Tools, die beim Verwalten (git) und Packen (setup.py, MANIFEST.in) helfen.

7
Alexander

Ein Paket ist ein Verzeichnis mit einem __init__.py drin. Der Unterschied zu einem Verzeichnis besteht darin, dass Sie es importieren können.

Es gibt an sich keinen "Python-Weg", aber Sie werden feststellen, dass es eine gute Idee ist, alle Ihre Module in einem Paket unter einem projektbezogenen Namen zusammenzufassen.

Um dem Python style guide, PEP8) zu folgen, sollten die Paket- und Modulnamen alle in Kleinbuchstaben geschrieben sein. Wenn wir also davon ausgehen, dass das Projekt "Botond Statistics" heißt, würde Ihre Struktur ungefähr so ​​aussehen :

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

Sie würden dann die Stochastikklasse finden, indem Sie tun

from botondstats.indicators.stochastics.Stochastics

(Es gibt verschiedene Möglichkeiten, die Struktur beizubehalten, aber die Importe zu verkürzen, aber das ist eine andere Frage).

Sie können diese Struktur unter src/ wenn du willst, aber es ist nicht notwendig. Ich mache nie. Stattdessen habe ich ein Hauptverzeichnis:

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

In diesem Verzeichnis habe ich normalerweise auch ein Virtualenv, also habe ich tatsächlich auch bin/lib/et al. Die Entwicklung erfolgt normalerweise durch Ausführen

./bin/python setup.py tests

Da benutze ich den Distrubute-Testläufer, um die Tests auszuführen.

So mach ich es. :-)

4
Lennart Regebro

Versuchen python_boilerplate_template:

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

3
KT.

Das cookiecutter Projekt von audreyr enthält mehrere Python Projektvorlagen:

Das Paket verwendet ein einzelnes ~/.cookiecutterrc-Datei zum Erstellen benutzerdefinierter Projektvorlagen in Python, Java, JS und anderen Sprachen.

Zum Beispiel eine Python Vorlage, die mit PyPI kompatibel ist:

cookiecutter-pypackage

1
Anton Tarasenko