Einführung
In diesem Lab lernen Sie, wie Sie zwischen Modulen und Paketen in Python unterscheiden können, was für die effektive Organisation und Verwaltung Ihres Codes von entscheidender Bedeutung ist. Das Lab führt Sie durch den Prozess der Erstellung eines Pakets namens my_package, das eine __init__.py-Datei und ein Modul namens my_module.py enthält.
Anschließend erstellen Sie ein main.py-Skript außerhalb des Pakets, um das Modul zu importieren und zu verwenden. Dies verdeutlicht den Unterschied zwischen einem Modul (eine einzelne Datei, die Python-Code enthält) und einem Paket (eine Verzeichnisstruktur, die Module und eine __init__.py-Datei enthält). Das Lab legt die Grundlage für das Verständnis, wie Sie überprüfen können, ob ein Modul ein Paket ist, indem Sie das __path__-Attribut und die pkgutil.get_loader-Methode verwenden. Dies wird in den folgenden Schritten behandelt.
Unterscheidung zwischen Modulen und Paketen
In diesem Schritt lernen Sie, wie Sie zwischen Modulen und Paketen in Python unterscheiden können. Das Verständnis dieses Unterschieds ist für die effektive Organisation und Verwaltung Ihres Python-Codes von entscheidender Bedeutung.
Module
Ein Modul ist eine einzelne Datei (oder mehrere Dateien), die Python-Code enthält, wie z. B. Funktionsdefinitionen, Klassen oder Variablen. Module werden verwendet, um Code in wiederverwendbare Einheiten zu organisieren.
Pakete
Ein Paket ist eine Möglichkeit, verwandte Module in einer Verzeichnisstruktur zu organisieren. Ein Paket enthält eine oder mehrere Moduldateien und eine spezielle Datei namens __init__.py. Die __init__.py-Datei kann leer sein, aber ihre Existenz zeigt an, dass das Verzeichnis als Paket behandelt werden sollte.
Lassen Sie uns ein einfaches Beispiel erstellen, um den Unterschied zu veranschaulichen.
Erstellen Sie zunächst ein Verzeichnis namens
my_packagein Ihrem~/project-Verzeichnis. Dies wird unser Paketverzeichnis sein.mkdir ~/project/my_packageNavigieren Sie in das
my_package-Verzeichnis:cd ~/project/my_packageErstellen Sie eine leere Datei namens
__init__.pyimmy_package-Verzeichnis. Diese Datei zeigt an, dassmy_packageein Python-Paket ist.touch __init__.pyErstellen Sie jetzt eine Datei namens
my_module.pyimmy_package-Verzeichnis. Dies wird unsere Moduldatei sein.touch my_module.pyÖffnen Sie
my_module.pyim VS Code-Editor und fügen Sie den folgenden Code hinzu:## my_module.py def greet(name): return f"Hello, {name}!"Speichern Sie die
my_module.py-Datei.Jetzt erstellen wir ein Python-Skript außerhalb des
my_package-Verzeichnisses, um unser Modul zu verwenden. Navigieren Sie zurück in das~/project-Verzeichnis:cd ~/projectErstellen Sie eine Datei namens
main.pyim~/project-Verzeichnis.touch main.pyÖffnen Sie
main.pyim VS Code-Editor und fügen Sie den folgenden Code hinzu:## main.py import my_package.my_module result = my_package.my_module.greet("LabEx User") print(result)Speichern Sie die
main.py-Datei.Führen Sie das
main.py-Skript aus:python main.pySie sollten die folgende Ausgabe sehen:
Hello, LabEx User!
Dieses Beispiel zeigt, wie ein Modul (my_module.py) innerhalb eines Pakets (my_package) organisiert wird. Die __init__.py-Datei ist essentiell, damit Python das Verzeichnis als Paket erkennt.
Prüfung auf das path-Attribut
In diesem Schritt lernen Sie, wie Sie im Python-Paketen auf das __path__-Attribut prüfen können. Das __path__-Attribut ist ein entscheidender Indikator dafür, ob ein Verzeichnis als Paket oder nur als normales Verzeichnis behandelt wird.
Das __path__-Attribut
Wenn Python ein Paket importiert, sucht es nach dem __path__-Attribut. Wenn dieses Attribut existiert, behandelt Python das Verzeichnis als Paket und sucht in den Pfaden, die in __path__ aufgeführt sind, nach Submodulen und Subpaketen. Wenn __path__ nicht existiert, behandelt Python das Verzeichnis als normales Verzeichnis.
Lassen Sie uns mit dem my_package-Beispiel aus dem vorherigen Schritt fortfahren.
Navigieren Sie in das
~/project-Verzeichnis:cd ~/projectErstellen Sie eine neue Python-Datei namens
check_path.py:touch check_path.pyÖffnen Sie
check_path.pyim VS Code-Editor und fügen Sie den folgenden Code hinzu:## check_path.py import my_package try: print(my_package.__path__) except AttributeError: print("my_package does not have __path__ attribute") import my_package.my_module try: print(my_package.my_module.__path__) except AttributeError: print("my_package.my_module does not have __path__ attribute")Speichern Sie die
check_path.py-Datei.Führen Sie das
check_path.py-Skript aus:python check_path.pySie sollten eine Ausgabe ähnlich der folgenden sehen:
['/home/labex/project/my_package'] my_package.my_module does not have __path__ attributeDie Ausgabe zeigt, dass
my_packagedas__path__-Attribut hat, was bestätigt, dass es als Paket behandelt wird. Andererseits hatmy_package.my_module(das ein Modul ist) kein__path__-Attribut.
Diese Unterscheidung ist wichtig, um zu verstehen, wie Python Code organisiert und importiert. Pakete verwenden __path__, um verschachtelte Submodule und Subpakete zu ermöglichen, während Module einzelne Code-Dateien darstellen.
Verwendung von pkgutil.get_loader
In diesem Schritt lernen Sie, wie Sie pkgutil.get_loader verwenden können, um den Loader für ein Modul oder Paket abzurufen. Loader sind für das Laden von Modulen verantwortlich, und pkgutil.get_loader bietet eine bequeme Möglichkeit, auf sie zuzugreifen.
Was ist ein Loader?
Ein Loader ist ein Objekt, das weiß, wie es ein Modul laden kann. Es ist Teil der Import-Mechanik in Python. Es gibt verschiedene Arten von Loadern für verschiedene Modultypen (z. B. Quellcode, kompilierter Code oder Erweiterungsmodule).
Verwendung von pkgutil.get_loader
Die Funktion pkgutil.get_loader nimmt den Namen eines Moduls oder Pakets als Eingabe und gibt ein Loader-Objekt zurück, wenn eines gefunden wird. Wenn kein Loader gefunden wird, gibt sie None zurück.
Lassen Sie uns mit dem my_package-Beispiel aus den vorherigen Schritten fortfahren.
Navigieren Sie in das
~/project-Verzeichnis:cd ~/projectErstellen Sie eine neue Python-Datei namens
get_loader_example.py:touch get_loader_example.pyÖffnen Sie
get_loader_example.pyim VS Code-Editor und fügen Sie den folgenden Code hinzu:## get_loader_example.py import pkgutil loader = pkgutil.get_loader("my_package.my_module") if loader is not None: print(f"Loader found for my_package.my_module: {loader}") else: print("No loader found for my_package.my_module") loader = pkgutil.get_loader("os") if loader is not None: print(f"Loader found for os: {loader}") else: print("No loader found for os") loader = pkgutil.get_loader("nonexistent_module") if loader is not None: print(f"Loader found for nonexistent_module: {loader}") else: print("No loader found for nonexistent_module")Speichern Sie die
get_loader_example.py-Datei.Führen Sie das
get_loader_example.py-Skript aus:python get_loader_example.pySie sollten eine Ausgabe ähnlich der folgenden sehen:
Loader found for my_package.my_module: <_frozen_importlib_external.SourceFileLoader object at 0x...> Loader found for os: <_frozen_importlib_external.SourceFileLoader object at 0x...> No loader found for nonexistent_moduleDie Ausgabe zeigt, dass ein Loader für
my_package.my_moduleund das eingebauteos-Modul gefunden wurde, aber kein Loader fürnonexistent_module.
Dieses Beispiel zeigt, wie Sie pkgutil.get_loader verwenden können, um zu prüfen, ob ein Modul oder Paket geladen werden kann, und um sein Loader-Objekt abzurufen. Dies kann für die Introspektion und das dynamische Laden von Modulen nützlich sein.
Zusammenfassung
In diesem Lab haben Sie gelernt, den Unterschied zwischen Python-Modulen und -Paketen zu erkennen. Ein Modul ist eine einzelne Datei, die Python-Code enthält, während ein Paket eine Verzeichnisstruktur ist, die Module und eine __init__.py-Datei enthält. Die __init__.py-Datei kennzeichnet das Verzeichnis als Paket.
Sie haben ein Paket namens my_package mit einer __init__.py-Datei und einem Modul namens my_module.py erstellt, das eine greet-Funktion enthält. Anschließend haben Sie ein main.py-Skript außerhalb des Pakets erstellt, um die greet-Funktion aus dem my_module-Modul innerhalb des my_package-Pakets zu importieren und zu verwenden.



