Wie schreibe ich ein Python-Modul / -Paket?


Answers

Python 3 - AKTUALISIERT 18. November 2015

Fand die akzeptierte Antwort nützlich, wollte aber aufgrund meiner eigenen Erfahrungen einige Punkte zum Wohle anderer erweitern.

Modul: Ein Modul ist eine Datei, die Python-Definitionen und -Anweisungen enthält. Der Dateiname ist der Modulname mit dem angehängten Suffix .py.

Modul Beispiel : Angenommen, wir haben ein einzelnes Python-Skript im aktuellen Verzeichnis, hier nenne ich es mymodule.py

Die Datei mymodule.py enthält den folgenden Code:

def myfunc():
    print("Hello!")

Wenn wir den Python3-Interpreter aus dem aktuellen Verzeichnis ausführen, können wir die Funktion myfunc auf die folgenden Arten importieren und ausführen (Sie würden normalerweise nur eine der folgenden Möglichkeiten wählen):

>>> import mymodule
>>> mymodule.myfunc()
Hello!
>>> from mymodule import myfunc
>>> myfunc()
Hello!
>>> from mymodule import *
>>> myfunc()
Hello!

Ok, das war einfach genug.

Angenommen, Sie müssen dieses Modul in einen eigenen dedizierten Ordner stellen, um einen Modul-Namespace bereitzustellen, anstatt es nur ad-hoc aus dem aktuellen Arbeitsverzeichnis auszuführen. Hier lohnt es sich, das Konzept eines Pakets zu erklären.

Paket : Pakete sind eine Möglichkeit, den Python-Modul-Namespace zu strukturieren, indem "gepunktete Modulnamen" verwendet werden. Zum Beispiel bezeichnet der Modulname AB ein Submodul namens B in einem Paket namens A. Genauso wie die Verwendung von Modulen die Autoren verschiedener Module davor bewahrt, sich um die globalen Variablennamen der anderen kümmern zu müssen, erspart die Verwendung von punktierten Modulnamen den Autoren von Multi-Modul-Paketen wie NumPy oder der Python Imaging Library, die sich um die Namen der anderen Module kümmern müssen.

Paketbeispiel : Nehmen wir an, wir haben den folgenden Ordner und die folgenden Dateien. Hier ist mymodule.py identisch mit vorher und __init__.py ist eine leere Datei:

.
└── mypackage
    ├── __init__.py
    └── mymodule.py

Die Dateien __init__.py sind erforderlich, damit Python die Verzeichnisse als Pakete behandelt. Weitere Informationen finden Sie in der Dokumentation zu den Modulen, die später bereitgestellt werden.

Unser aktuelles Arbeitsverzeichnis befindet sich eine Ebene über dem gewöhnlichen Ordner namens mypackage

$ ls
mypackage

Wenn wir jetzt den Python3-Interpreter ausführen, können wir das Modul mymodule.py, das die erforderliche Funktion myfunc enthält, auf die folgende Weise importieren und ausführen (Sie würden normalerweise nur eine der folgenden Möglichkeiten wählen):

>>> import mypackage
>>> from mypackage import mymodule
>>> mymodule.myfunc()
Hello!
>>> import mypackage.mymodule
>>> mypackage.mymodule.myfunc()
Hello!
>>> from mypackage import mymodule
>>> mymodule.myfunc()
Hello!
>>> from mypackage.mymodule import myfunc
>>> myfunc()
Hello!
>>> from mypackage.mymodule import *
>>> myfunc()
Hello!

Unter der Annahme von Python 3 gibt es eine hervorragende Dokumentation unter: Modules

In Bezug auf die Namenskonventionen für Pakete und Module sind die allgemeinen Richtlinien in PEP-0008 angegeben - siehe Paket- und Modulnamen

Module sollten kurze, ausschließlich aus Kleinbuchstaben bestehende Namen haben. Unterstriche können im Modulnamen verwendet werden, wenn sie die Lesbarkeit verbessern. Python-Pakete sollten auch kurze, vollständige Namen haben, obwohl die Verwendung von Unterstrichen nicht empfohlen wird.

Question

Ich habe Python-Skripte für einfache Aufgaben bei der Arbeit gemacht und nie wirklich darauf geachtet, sie für andere zu verpacken. Jetzt wurde mir zugewiesen, einen Python-Wrapper für eine REST-API zu erstellen. Ich habe absolut keine Ahnung, wie ich anfangen soll und ich brauche Hilfe.

Was ich habe:

(Ich möchte nur so genau wie möglich sein) Ich habe das virtualenv bereit, es ist auch in github , die .gitignore-Datei für Python ist auch da, sowie die Requests-Bibliothek für die Interaktion mit der REST-API. Das ist es.

Hier ist der aktuelle Verzeichnisbaum

.
├── bin
│   └── /the usual stuff/
├── include
│   └── /the usual stuff/
├── lib
│   └── python2.7
│       └── /the usual stuff/
├── local
│   └── /the usual stuff/
└── README.md

27 directories, 280 files

Ich weiß nicht einmal, wo ich die .py-Dateien ablegen soll, wenn ich je eine mache.

Was ich machen wollte:

Mache ein Python-Modul installierbar mit "pip install ..."

Wenn möglich, möchte ich einen allgemeinen Schritt für Schritt Prozess beim Schreiben von Python-Modulen.




Sobald Sie Ihre ausgewählten Befehle definiert haben, können Sie die gespeicherte Datei einfach per Drag & Drop in den Lib-Ordner in Ihren Python-Programmdateien ziehen.

>>> import mymodule 
>>> mymodule.myfunc()