it-swarm.com.de

Was ist der Unterschied zwischen einem Python Modul und einem Python Paket?

Was ist der Unterschied zwischen einem Python Modul und einem Python Paket?

Siehe auch: Was ist der Unterschied zwischen "package" und "module" (für andere Sprachen)

487
Dave

Ein Modul ist eine einzelne Datei (oder Dateien), die unter einem Import importiert und verwendet werden. z.B.

import my_module

Ein Paket ist eine Sammlung von Modulen in Verzeichnissen, die eine Pakethierarchie enthalten.

from my_package.timing.danger.internets import function_of_love

Dokumentation für Module

Einführung in Pakete

321
Jakob Bowyer

Jede Python -Datei ist ein Modul , dessen Name der Basisname der Datei ohne die Erweiterung .py 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 Module, 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 beliebig tief verschachtelt werden, sofern die entsprechenden Verzeichnisse eine eigene __init__.py -Datei enthalten.

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, nicht Unterpakete oder Module. Betrachten Sie beispielsweise das Paket xml in der Standardbibliothek Python: Das Verzeichnis xml enthält eine Datei __init__.py und vier Unterverzeichnisse. Das Unterverzeichnis etree enthält eine __init__.py -Datei und unter anderem eine ElementTree.py -Datei. Sehen Sie, was passiert, wenn Sie versuchen, Pakete/Module interaktiv zu importieren:

>>> import xml
>>> type(xml)
<type 'module'>
>>> xml.etree.ElementTree
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'etree'
>>> import xml.etree
>>> type(xml.etree)
<type 'module'>
>>> xml.etree.ElementTree
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'ElementTree'
>>> import xml.etree.ElementTree
>>> type(xml.etree.ElementTree)
<type 'module'>
>>> xml.etree.ElementTree.parse
<function parse at 0x00B135B0>

In Python gibt es auch integrierte Module wie sys, die in C geschrieben sind, aber ich glaube nicht, dass Sie diese in Ihrer Frage berücksichtigen wollten.

482

Aus dem Python-Glossar :

Es ist wichtig zu beachten, dass alle Pakete Module sind, aber nicht alle Module Pakete. Oder anders ausgedrückt: Pakete sind nur eine besondere Art von Modulen. Insbesondere wird jedes Modul, das ein __path__ -Attribut enthält, als Paket betrachtet.

Python-Dateien mit einem Bindestrich im Namen wie my-file.py können nicht mit einer einfachen import -Anweisung importiert werden. In Bezug auf den Code ist import my-file dasselbe wie import my - file, was eine Ausnahme auslöst. Solche Dateien lassen sich besser als Skripte charakterisieren, während importierbare Dateien Module sind.

30
jolvi

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 Festplattendatei wie a/b/c.py informell als "Modul" bezeichnen, wird sie erst dann tatsächlich zu einer Datei, wenn sie mit Informationen aus mehreren anderen Quellen (wie sys.path) kombiniert wird, um das Modulobjekt zu erstellen .

(Beachten Sie beispielsweise, dass zwei Module mit unterschiedlichen Namen aus derselben Datei geladen werden können, abhängig von sys.path und anderen Einstellungen. Genau dies geschieht mit python -m my.module, gefolgt von import my.module. Im Interpreter gibt es zwei Modulobjekte, __main__ und my.module, die beide aus derselben Datei auf der Festplatte erstellt wurden, my/module.py.)

Ein Paket ist ein Modul, das Submodule (einschließlich Subpakete) enthalten kann. Dies können nicht alle Module. Erstellen Sie beispielsweise eine kleine Modulhierarchie:

$ mkdir -p a/b
$ touch a/b/c.py

Stellen Sie sicher, dass unter a keine weiteren Dateien vorhanden sind. Starten Sie einen Interpreter für Python 3.4 oder höher (z. B. mit python3 -i) und überprüfen Sie die Ergebnisse der folgenden Anweisungen:

import a
a                ⇒ <module 'a' (namespace)>
a.b              ⇒ AttributeError: module 'a' has no attribute 'b'
import a.b.c
a.b              ⇒ <module 'a.b' (namespace)>
a.b.c            ⇒ <module 'a.b.c' from '/home/cjs/a/b/c.py'>

Module a und a.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). Modul a.b.c ist jedoch kein Paket. Wir können dies demonstrieren, indem wir der obigen Verzeichnisstruktur die Datei a/b.py hinzufügen und einen neuen Interpreter starten:

import a.b.c
⇒ ImportError: No module named 'a.b.c'; 'a.b' is not a package
import a.b
a                ⇒ <module 'a' (namespace)>
a.__path__       ⇒ _NamespacePath(['/.../a'])
a.b              ⇒ <module 'a.b' from '/home/cjs/tmp/a/b.py'>
a.b.__path__     ⇒ AttributeError: 'module' object has no attribute '__path__'

Python stellt sicher, dass alle übergeordneten Module geladen werden, bevor ein untergeordnetes Modul geladen wird. Oben steht, dass a/ ein Verzeichnis ist und daher ein Namespace-Paket a erstellt, und dass a/b.py eine Python Quelldatei ist, die geladen und zum Erstellen verwendet wird ein (nicht paketiertes) Modul a.b. Zu diesem Zeitpunkt können Sie kein Modul a.b.c haben, da a.b kein Paket ist und daher keine Submodule haben kann.

Sie können hier auch sehen, dass das Paketmodul a ein __path__ -Attribut hat (Pakete müssen dies haben), das Nicht-Paketmodul a.b jedoch nicht.

14
Curt J. Sampson

Eine späte Antwort, noch eine Definition:

Ein Paket wird durch eine importierte Top-Entität dargestellt, die entweder ein in sich geschlossenes Modul oder das Sondermodul __init__.py als Top-Entität aus einer Reihe von Modulen in einer Unterverzeichnisstruktur sein kann.

Ein Paket ist also physisch eine Verteilungseinheit, die ein oder mehrere Module bereitstellt.

1
acue