Was ist der Unterschied zwischen einem Python-Modul und einem Python-Paket?
Siehe auch: Was ist der Unterschied zwischen "Paket" und "Modul" (für andere Sprachen)
Was ist der Unterschied zwischen einem Python-Modul und einem Python-Paket?
Siehe auch: Was ist der Unterschied zwischen "Paket" und "Modul" (für andere Sprachen)
__init__.py
Datei enthalten .from plumbum.cmd import ls
Implementierung__init__.py
Antworten:
Ein Modul ist eine einzelne Datei (oder Dateien), die unter einem Import importiert und verwendet werden. z.B
Ein Paket ist eine Sammlung von Modulen in Verzeichnissen, die eine Pakethierarchie angeben.
Dokumentation für Module
Einführung in Pakete
quelle
__path__
Attribut.__init__.py
Datei gebildet. Sie sind Module, die andere Module enthalten können.__path__
Attribut.Jede Python-Datei ist ein Modul , dessen Name der Basisname der Datei ohne die
.py
Erweiterung ist. Ein Paket ist eine Sammlung von Python-Modulen: Während ein Modul eine einzelne Python-Datei ist, ist ein Paket ein Verzeichnis von Python-Modulen, die eine zusätzliche__init__.py
Datei enthalten, um ein Paket von einem Verzeichnis zu unterscheiden, das zufällig eine Reihe von Python-Skripten enthält. Pakete können bis zu einer beliebigen Tiefe verschachtelt werden, vorausgesetzt, die entsprechenden Verzeichnisse enthalten eine eigene__init__.py
Datei.Die Unterscheidung zwischen Modul und Paket scheint nur auf Dateisystemebene zu gelten. Wenn Sie ein Modul oder ein Paket importieren, ist das entsprechende von Python erstellte Objekt immer vom Typ
module
. Beachten Sie jedoch, dass beim Importieren eines Pakets nur Variablen / Funktionen / Klassen in der__init__.py
Datei dieses Pakets direkt sichtbar sind, keine Unterpakete oder Module. Betrachten Sie als Beispiel dasxml
Paket in der Python-Standardbibliothek: Dasxml
Verzeichnis enthält eine__init__.py
Datei und vier Unterverzeichnisse. Das Unterverzeichnisetree
enthält eine__init__.py
Datei und unter anderem eineElementTree.py
Datei. Sehen Sie, was passiert, wenn Sie versuchen, Pakete / Module interaktiv zu importieren:In Python gibt es auch integrierte Module, z. B.
sys
, die in C geschrieben sind, aber ich glaube nicht, dass Sie diese in Ihrer Frage berücksichtigen wollten.quelle
module
. Ich bin gerade dabei, einen Debugger zu schreiben, und habe mir Sorgen gemacht, dass mein Debugger nicht korrekt gesagt hat, dass meine Paketemodule
s sind.import
Anweisung, da Bindestriche in Python-Bezeichnern nicht zulässig sind. Verwenden Sieimportlib.import_module()
stattdessen.Aus dem Python-Glossar :
Python-Dateien mit einem Bindestrich im Namen
my-file.py
können nicht mit einer einfachenimport
Anweisung importiert werden . Code-weiseimport my-file
ist das gleiche,import my - file
was eine Ausnahme auslöst. Solche Dateien werden besser als Skripte charakterisiert, während importierbare Dateien Module sind .quelle
Denken Sie zunächst daran, dass ein Modul in seiner genauen Definition ein Objekt im Speicher eines Python-Interpreters ist, das häufig durch Lesen einer oder mehrerer Dateien von der Festplatte erstellt wird. Während wir eine Datenträgerdatei wie
a/b/c.py
ein "Modul" informell aufrufen können , wird sie erst dann zu einer, wenn sie mit Informationen aus mehreren anderen Quellen (z. B.sys.path
) kombiniert wird , um das Modulobjekt zu erstellen.(Beachten Sie beispielsweise, dass zwei Module mit unterschiedlichen Namen abhängig von
sys.path
und anderen Einstellungen aus derselben Datei geladen werden können. Genau dies geschieht mitpython -m my.module
einemimport my.module
im Interpreter gefolgt von einem ; es werden zwei Modulobjekte erstellt__main__
undmy.module
beide erstellt aus derselben Datei auf der Festplatte ,my/module.py
.)Ein Paket ist ein Modul, das Submodule (einschließlich Subpakete) enthalten kann. Dies können nicht alle Module. Erstellen Sie als Beispiel eine kleine Modulhierarchie:
Stellen Sie sicher, dass sich keine anderen Dateien unter befinden
a
. Starten Sie einen Python 3.4- oder späteren Interpreter (z. B. mitpython3 -i
) und überprüfen Sie die Ergebnisse der folgenden Anweisungen:Module
a
unda.b
sind Pakete (in der Tat eine bestimmte Art von Paket, das als "Namespace-Paket" bezeichnet wird, obwohl wir uns hier nicht darum kümmern müssen). Das Modula.b.c
ist jedoch kein Paket. Wir können dies demonstrieren, indem wira/b.py
der obigen Verzeichnisstruktur eine weitere Datei hinzufügen und einen neuen Interpreter starten:Python stellt sicher, dass alle übergeordneten Module geladen werden, bevor ein untergeordnetes Modul geladen wird. Darüber , dass findet
a/
ein Verzeichnis ist , und schafft so ein Namespace - Paketa
, und dasa/b.py
ist eine Datei Python Quelle , die es lädt und verwendet ein (nicht-Paket) Modul zu erstellena.b
. Zu diesem Zeitpunkt können Sie kein Modul haben,a.b.c
daa.b
es sich nicht um ein Paket handelt und daher keine Submodule haben können.Sie können hier auch sehen, dass das Paketmodul
a
ein__path__
Attribut hat (Pakete müssen dieses haben), das Nicht-Paketmodula.b
jedoch nicht.quelle
Eine späte Antwort, noch eine Definition:
Ein Paket ist also physisch eine Verteilungseinheit, die ein oder mehrere Module bereitstellt.
quelle
__init__.py
Modul. Wenn Sie jedoch über Verteilungseinheiten sprechen (üblicherweise über PyPI), ist dies ein ganz anderer Pakettyp (normalerweise definiert durch das Vorhandensein vonsetup.py
). Ich finde diese beiden Verwendungen des Begriffspackage
verwirrend und habe mit einigen Python-Anfängern gesprochen, die ihn äußerst verwirrend finden.Das Paket ist auch ein Modul, das andere Module, "einfache dateibasierte Module und Pakete (Unterpaket)" enthalten kann. Der Code für den Pakettyp des Moduls wird in die
__init__.py
Datei aufgenommen.Während Module eine einfache Datei sind, die Funktionen, Klassen, ausführbaren Code usw. enthalten kann, verhält sie sich nach dem Importieren eines Moduls wie ein Objekt, mit dem Sie auf die im Modul definierten Bezeichner zugreifen können.
quelle