Module und Pakete in Python importieren

PythonBeginner
Jetzt üben

Einführung

In diesem Lab lernen Sie die Grundlagen der Organisation und Wiederverwendung von Code in Python kennen, indem Sie mit Modulen und Paketen arbeiten. Wir beginnen damit, zu verstehen, was ein Python-Modul ist und wie sich sein Ausführungsverhalten ändert, je nachdem, ob es direkt ausgeführt oder importiert wird.

Anschließend üben Sie die beiden Hauptmethoden, um Code aus Modulen in Ihr Programm zu integrieren: die import-Anweisung zum Laden eines gesamten Moduls und die from...import-Anweisung zum Laden spezifischer Funktionen oder Variablen. Schließlich erfahren Sie, wie Sie zusammengehörige Module zu einem Paket strukturieren, um ein gut organisiertes und skalierbares Projekt zu erstellen. Alle Programmierarbeiten werden innerhalb der WebIDE unter Verwendung von Python-Dateien und dem Terminal durchgeführt.

Python Module verstehen

Ein Modul in Python ist einfach eine Datei, die Python-Code enthält und die die Erweiterung .py besitzt. Module ermöglichen es Ihnen, Ihren Code logisch zu organisieren, was die Verwaltung und Wiederverwendung erleichtert. Funktionen, Klassen und Variablen, die in einem Modul definiert sind, können in anderen Skripten verwendet werden.

In Ihrer WebIDE sehen Sie auf der linken Seite einen Datei-Explorer. Die Laborumgebung hat bereits eine Datei namens hello.py im Verzeichnis ~/project erstellt.

Öffnen Sie zuerst hello.py, um seinen Inhalt zu untersuchen. Er sollte den folgenden Code enthalten:

print("This code runs on import or direct execution.")

if __name__ == "__main__":
    print("This code runs ONLY when the script is executed directly.")

Der Block if __name__ == "__main__": ist eine spezielle Konstruktion in Python. Die Variable __name__ ist eine eingebaute Variable, die sich zum Namen des aktuellen Moduls auflöst. Wenn ein Python-Skript direkt über die Kommandozeile ausgeführt wird, wird sein __name__ auf den String "__main__" gesetzt. Diese if-Anweisung ermöglicht es Ihnen, Code zu schreiben, der nur ausgeführt wird, wenn die Datei als Hauptprogramm ausgeführt wird, nicht aber, wenn sie von einem anderen Modul importiert wird.

Sehen wir uns dies in Aktion an. Öffnen Sie das Terminal in Ihrer WebIDE und führen Sie das Skript hello.py direkt aus:

python3 hello.py

Sie sehen die folgende Ausgabe, da beide print-Anweisungen ausgeführt werden:

This code runs on import or direct execution.
This code runs ONLY when the script is executed directly.

Dies demonstriert das Verhalten eines Skripts, wenn es das Hauptprogramm ist, das ausgeführt wird. Im nächsten Schritt werden wir sehen, was passiert, wenn wir es als Modul importieren.

Module mit der import-Anweisung importieren

Die gebräuchlichste Methode, ein Modul zu verwenden, ist der Import mittels der import-Anweisung. Dadurch wird der gesamte Code im Modul für Ihr aktuelles Skript verfügbar gemacht.

Im Datei-Explorer finden Sie eine leere Datei namens main.py. Dies wird unser Hauptskript für den Rest des Labs sein.

Öffnen Sie main.py und fügen Sie die folgende Zeile hinzu, um das Modul hello zu importieren:

import hello

print("The main.py script has finished.")

Speichern Sie die Datei. Führen Sie nun main.py im Terminal aus:

python3 main.py

Beobachten Sie die Ausgabe genau:

This code runs on import or direct execution.
The main.py script has finished.

Beachten Sie, dass nur die erste print-Anweisung aus hello.py ausgeführt wurde. Der Code innerhalb des Blocks if __name__ == "__main__": wurde übersprungen. Dies liegt daran, dass beim Importieren von hello durch main.py die Variable __name__ im Kontext von hello.py auf "hello" (den Namen des Moduls) und nicht auf "__main__" gesetzt wird. Diese Funktion ist entscheidend für die Erstellung wiederverwendbarer Module, die beim Import keine unerwünschten Nebeneffekte erzeugen.

Arbeiten wir nun mit einem Modul, das mehr als nur print-Anweisungen enthält. Öffnen Sie die Datei module_a.py. Sie enthält eine Variable, eine Funktion und eine Klasse.

PI = 3.14159

def greet(name):
 print(f"Hello, {name} from module_a!")

class Calculator:
    def add(self, x, y):
        return x + y

Ändern Sie main.py, um module_a zu importieren und dessen Mitglieder zu verwenden. Um auf ein Mitglied eines importierten Moduls zuzugreifen, verwenden Sie die Syntax modulname.mitgliedsname.

Ersetzen Sie den Inhalt von main.py durch Folgendes:

import module_a

## Zugriff auf die PI-Variable
print(f"The value of PI is {module_a.PI}")

## Aufruf der greet-Funktion
module_a.greet("LabEx")

## Erstellen einer Instanz der Calculator-Klasse und Verwendung ihrer Methode
calc = module_a.Calculator()
result = calc.add(5, 3)
print(f"5 + 3 = {result}")

Speichern Sie die Datei und führen Sie sie aus:

python3 main.py

Die Ausgabe wird sein:

The value of PI is 3.14159
Hello, LabEx from module_a!
5 + 3 = 8

Dies demonstriert, wie die import-Anweisung ein gesamtes Modul lädt und wie Sie auf dessen Inhalt zugreifen, indem Sie den Namen des Moduls als Präfix verwenden.

Spezifische Objekte mit from...import importieren

Manchmal benötigen Sie nur einige spezifische Elemente aus einem Modul. Die from...import-Anweisung ermöglicht es Ihnen, bestimmte Funktionen, Klassen oder Variablen direkt in den Namespace Ihres aktuellen Skripts zu importieren. Das bedeutet, Sie können sie ohne das Präfix modulname. verwenden.

Modifizieren wir main.py, um diese Importmethode zu verwenden. Anstatt das gesamte module_a zu importieren, werden wir nur die Variable PI und die Funktion greet importieren.

Aktualisieren Sie main.py mit dem folgenden Code:

from module_a import PI, greet

## Zugriff auf PI und greet direkt ohne das Modulpräfix
print(f"The value of PI is {PI}")
greet("World")

Speichern Sie die Datei und führen Sie sie im Terminal aus:

python3 main.py

Die Ausgabe wird sein:

The value of PI is 3.14159
Hello, World from module_a!

Wie Sie sehen, werden PI und greet direkt verwendet. Wenn Sie jedoch versuchen, auf etwas zuzugreifen, das Sie nicht importiert haben, wie z. B. die Klasse Calculator, erhalten Sie einen Fehler.

Probieren Sie es jetzt aus. Fügen Sie die folgenden Zeilen am Ende von main.py hinzu:

calc = Calculator()
print(calc.add(10, 20))

Führen Sie das Skript erneut aus:

python3 main.py

Dieses Mal schlägt das Skript mit einem NameError fehl:

The value of PI is 3.14159
Hello, World from module_a!
Traceback (most recent call last):
  File "/home/labex/project/main.py", line 7, in <module>
    calc = Calculator()
NameError: name 'Calculator' is not defined

Dieser Fehler bestätigt, dass nur die in der from...import-Anweisung angegebenen Objekte in den aktuellen Namespace übernommen werden. Diese Methode kann Ihren Code lesbarer machen, erhöht jedoch auch das Risiko von Namenskonflikten, wenn Sie Objekte mit demselben Namen aus verschiedenen Modulen importieren.

Bevor Sie mit dem nächsten Schritt fortfahren, entfernen Sie die beiden Zeilen, die den Fehler verursacht haben, aus main.py.

Python-Pakete verstehen und verwenden

Wenn Projekte wachsen, möchten Sie möglicherweise zusammengehörige Module in einer einzigen Verzeichnishierarchie organisieren. Dafür sind Pakete gedacht. Ein Paket ist ein Verzeichnis, das eine spezielle Datei namens __init__.py enthält (die leer sein kann). Die Existenz dieser Datei signalisiert Python, das Verzeichnis als Paket zu behandeln.

Erstellen wir ein Paket, um unser module_a aufzunehmen.

Erstellen Sie zunächst ein neues Verzeichnis namens my_package im Verzeichnis ~/project. Dies können Sie tun, indem Sie im Datei-Explorer mit der rechten Maustaste klicken und „Neuer Ordner“ auswählen.

mkdir my_package

Erstellen Sie als Nächstes die erforderliche Datei __init__.py im neuen Verzeichnis my_package.

touch my_package/__init__.py

Verschieben Sie nun module_a.py in das Verzeichnis my_package. Sie können die Datei im Datei-Explorer per Drag & Drop verschieben.

mv module_a.py my_package/

Ihre Projektstruktur sollte nun wie folgt aussehen:

~/project/
├── main.py
├── hello.py
└── my_package/
    ├── __init__.py
    └── module_a.py

Mit dieser Paketstruktur müssen wir aktualisieren, wie wir module_a in unserem Skript main.py importieren. Um ein Modul aus einem Paket zu importieren, verwenden Sie punktierte Modulnamen, wie paketname.modulname.

Öffnen Sie main.py und ändern Sie es so, dass die Funktion greet aus my_package.module_a importiert wird:

from my_package.module_a import greet

greet("Package")

Speichern Sie die Datei und führen Sie sie aus:

python3 main.py

Sie sollten die folgende Ausgabe sehen:

Hello, Package from module_a!

Dies zeigt, wie ein spezifisches Objekt aus einem Modul innerhalb eines Pakets importiert wird. Alternativ könnten Sie das Modul selbst importieren:

## Alternative Importmethode
import my_package.module_a

my_package.module_a.greet("Alternative")

Pakete sind ein mächtiges Werkzeug, um große Codebasen, wie Bibliotheken und Frameworks, in eine klare und wartbare Struktur zu organisieren.

Zusammenfassung

In diesem Lab haben Sie die wesentlichen Konzepte der Code-Organisation in Python kennengelernt. Sie begannen damit, zu verstehen, was ein Modul ist und welchen Zweck der Block if __name__ == "__main__": zur Erstellung wiederverwendbaren Codes erfüllt. Anschließend übten Sie das Importieren von Modulen mithilfe der Syntax import modulname und den Zugriff auf deren Elemente mittels Punktnotation.

Darüber hinaus haben Sie die from...import-Anweisung erkundet, um spezifische Objekte aus einem Modul direkt in den Namespace Ihres Skripts zu holen. Schließlich haben Sie gelernt, wie zusammengehörige Module in einem Paket strukturiert werden, indem Sie ein Verzeichnis mit einer __init__.py-Datei erstellen, und wie man aus diesem Paket importiert. Diese Fähigkeiten sind grundlegend für das Schreiben von sauberem, organisiertem und skalierbarem Python-Code.