Wie organisiere ich ein Python-Projekt?

75

Ich bin neu in Python und starte ein Mini-Projekt, aber ich habe einige Zweifel, wie ich die Ordner auf "Python-Weise" organisieren soll.

Ich verwende PyDevin meiner Entwicklungsumgebung, und wenn ich ein neues Projekt erstelle, wird ein Ordner mit dem Namen erstelltsrc

+ src

Jetzt PyDevkann ich in der erstellen Pydev ModuleundPyDev 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 Bezug auf Module und Pakete organisieren? Was bedeuten Module und Pakete?

Freundliche Grüße,

André
quelle
1
Ich kann diesen Link aus dem offiziellen Python-Tutorial empfehlen . Ist es ziemlich klar und direkt.
LiorK
Ein sehr neuer hilfreicher Beitrag: Ein Python-Projekt richtig
starten

Antworten:

49

Ein Paket ist im Grunde ein Ordner mit einer __init__.pyDatei darunter und normalerweise einigen Modulen, wobei Modul eine *.pyDatei ist. Es hat importhauptsächlich damit zu tun . Wenn Sie __init__.pyIndikatoren hinzufügen , können Sie Folgendes verwenden:

from Indicators.Stochastics import *

oder

from Indicators import Stochastics

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

Botond Béres
quelle
40

Aus Sicht des Dateisystems ist ein Modul eine Datei, die mit endet, .pyund ein Paket ist ein Ordner, der wieder Module und (verschachtelte) Pakete enthält. Python erkennt einen Ordner als Paket, wenn er eine __init__.pyDatei enthält .

Eine solche Dateistruktur

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

definiert das Paket some, das ein Modul enthält, foofoound ein verschachteltes Paket thing, das wiederum ein Modul enthält barbar. Wenn Sie jedoch Pakete und Module verwenden, unterscheiden Sie diese beiden Typen nicht wirklich:

import some

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

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

Bitte folgen Sie PEP8, wenn Sie die Benennung Ihrer Pakete / Module auswählen (dh Kleinbuchstaben verwenden).

Oben Sonne
quelle
2
Kann ich die Funktion von aufrufen, foofoo.pywenn ich nur einige importiere? Ich bin verwirrt über die __init__.py, was soll ich dort setzen?
Jay Wong
27

Siehe Python-Paket-Vorlage

Verzeichnisaufbau

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

Katze 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
Vitaly Fadeev
quelle
2
Hallo Vitaly! Ich bin gerade auf Ihr Projekt gestoßen. Behalten Sie es noch bei? Vielen Dank!
Elias Dorneles
2
Endete mit einem 404
Dimitrios Mistriotis
2
Der Link https://github.com/vital-fadeev/python-package-templateist nicht mehr gültig. Wo ist diese Python-Paket-Vorlage zu finden?
Zahnstocher Anemone
14

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

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

Rick
quelle
8

Bevor Sie sich für eine Projektstruktur entscheiden, sollten Sie sich fragen, was der Zweck des Projekts sein wird. 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-Notizbücher . Das Notizbuch erfasst den Fluss Ihrer Gedanken, und Sie können Ihrem Code Notizen im 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 herauszufinden, ob es überhaupt machbar ist und es sich daher lohnt, mehr Zeit damit zu verbringen. Ein Teil von Pythons Philosophie lautet: "Versuchen Sie nicht, perfekt zu sein, denn" gut genug "ist oft genau das." Sie können später jederzeit wiederkommen und Ihr Projekt so strukturieren, dass die besten Methoden der Softwareentwicklung eingehalten werden.
  • Wenn Sie Ihr Projekt so strukturieren möchten, dass Sie es später verteilen können und es auf viele Module skaliert werden kann, 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 mir diese Struktur gefällt, finden Sie in meinem Blogbeitrag. Das Wesentliche ist jedoch, dass das hierarchisch niedrigere projectnameVerzeichnis Ihr eigentliches Projekt enthält. Daneben finden Sie alle Tools, mit denen Sie es verwalten (git) und verpacken (setup.py, MANIFEST.in) können.

Alexander
quelle
Wie würden Sie Ihr Projekt ausführen? Im Stammordner tun python3 -m projectname?
Buhtz
4

Ein Paket ist ein Verzeichnis mit einem __init__.pydarin. 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 mit einem projektbezogenen Namen zusammenzufassen.

Um dem Python-Styleguide PEP8 zu folgen, sollten die Paket- und Modulnamen in Kleinbuchstaben angegeben werden. Wenn wir also annehmen, 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 Stochastik-Klasse finden, indem Sie dies 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 unterstellen, src/wenn Sie möchten, dies ist jedoch nicht erforderlich. 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 eine virtuelle Umgebung, 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 Test Runner um die Tests durchzuführen.

So mach ich es. :-)

Lennart Regebro
quelle