W3docs

Python-Module

Python-Module verstehen: eigene Module erstellen, Aliase verwenden, from-import nutzen, die Standardbibliothek erkunden und sys.path verstehen.

Ein Modul ist eine Datei mit Python-Code — Funktionen, Klassen und Variablen —, die Sie in mehreren Programmen wiederverwenden können. Module sind die grundlegende Einheit der Codeorganisation in Python: Statt Logik zwischen Dateien zu kopieren, schreiben Sie sie einmal, speichern sie als .py-Datei und importieren sie überall dort, wo Sie sie benötigen. Dieses Kapitel behandelt alles vom Erstellen Ihres ersten Moduls bis zur Navigation durch die Standardbibliothek und dem Verständnis, wie Python Module zur Laufzeit findet.

Was ist ein Python-Modul?

Jede .py-Datei ist ein Modul. Wenn Sie schreiben:

# greetings.py
def hello(name):
    return f"Hello, {name}!"

def goodbye(name):
    return f"Goodbye, {name}!"

PI = 3.14159

haben Sie ein Modul namens greetings erstellt. Der Modulname ist der Dateiname ohne die Erweiterung .py.

Module können enthalten:

  • Funktionen — wiederverwendbare Logikblöcke (siehe Python-Funktionen)
  • Klassen — Vorlagen für Objekte (siehe Python-Klassen)
  • Variablen und Konstanten — gemeinsam genutzte Daten
  • Ausführbare Anweisungen — Code, der ausgeführt wird, wenn das Modul importiert oder direkt ausgeführt wird

Ein Modul importieren

Verwenden Sie die import-Anweisung gefolgt vom Modulnamen (ohne .py-Erweiterung).

import greetings

print(greetings.hello("Alice"))    # Hello, Alice!
print(greetings.goodbye("Alice"))  # Goodbye, Alice!
print(greetings.PI)                # 3.14159

Nach import greetings sind alle in greetings.py definierten Namen über das Präfix greetings. zugänglich. Diese Punktnotation verhindert Namenskonflikte — Ihre eigene Variable PI kann nicht mit greetings.PI kollidieren.

Bestimmte Namen mit from ... import importieren

Wenn Sie nur einen oder zwei Namen benötigen, importieren Sie diese direkt, sodass Sie sie ohne Modulpräfix verwenden können.

from greetings import hello, PI

print(hello("Bob"))   # Hello, Bob!
print(PI)             # 3.14159

Alles mit * importieren

from greetings import *

Dies zieht jeden öffentlichen Namen (die nicht mit _ beginnen) in den aktuellen Namespace. Vermeiden Sie dies in größeren Programmen: Es verschmutzt den Namespace und macht es schwer zu erkennen, woher ein Name stammt.

Import-Aliase mit as

Lange Modulnamen werden mühsam einzutippen. Verwenden Sie as, um einen kürzeren Alias zu erstellen.

import greetings as gr

print(gr.hello("Carol"))   # Hello, Carol!

Sie können auch einzelne importierte Namen mit einem Alias versehen:

from greetings import hello as hi

print(hi("Dave"))   # Hello, Dave!

Aliase sind besonders bei populären Bibliotheken verbreitet:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

Die Funktion dir()

dir(module) gibt eine sortierte Liste aller in einem Modul definierten Namen zurück — eine schnelle Möglichkeit, zu erkunden, was verfügbar ist.

import math
print(dir(math))
# ['__doc__', '__loader__', ..., 'acos', 'acosh', 'asin', ..., 'sqrt', 'tan', 'tanh', 'tau']

Rufen Sie dir() ohne Argumente auf, um die Namen im aktuellen Gültigkeitsbereich zu sehen.

Die Variable __name__

Jedes Modul hat eine eingebaute Variable namens __name__. Wenn eine Datei importiert wird, wird __name__ auf den Modulnamen gesetzt. Wenn die Datei direkt ausgeführt wird, wird __name__ auf den string "__main__" gesetzt.

Dieses Muster ist die Standardmethode, um Code zu schreiben, der nur ausgeführt wird, wenn die Datei als Skript ausgeführt wird — nicht wenn sie als Bibliothek importiert wird:

# greetings.py

def hello(name):
    return f"Hello, {name}!"

if __name__ == "__main__":
    # This block only runs when you execute: python greetings.py
    print(hello("World"))
import greetings   # The if-block does NOT run here

Dieses Muster wird in fast jeder nicht-trivialen Python-Datei verwendet, auf die Sie stoßen werden.

Modul-Suchpfad (sys.path)

Wenn Sie import greetings schreiben, sucht Python nach dem Modul in einer Liste von Verzeichnissen, die in sys.path gespeichert sind:

  1. Das Verzeichnis des ausgeführten Skripts (oder das aktuelle Verzeichnis im interaktiven Modus)
  2. In der Umgebungsvariable PYTHONPATH aufgelistete Verzeichnisse
  3. Die Verzeichnisse der Standardbibliothek
  4. Das Verzeichnis site-packages (wo von pip installierte Drittanbieter-Pakete liegen)
import sys
print(sys.path)
# ['/path/to/script', '/usr/lib/python3.11', ..., '/usr/lib/python3/dist-packages']

Sie können zur Laufzeit einen Pfad hinzufügen, aber dies ist für gut strukturierte Projekte selten notwendig:

import sys
sys.path.append("/path/to/my/libs")

Die Python-Standardbibliothek

Python wird mit einer umfangreichen Standardbibliothek geliefert — Hunderte von Modulen, die alles von Datei-I/O über Netzwerkprotokolle bis hin zur Datenkomprimierung abdecken. Sie müssen nichts installieren; importieren Sie sie einfach.

math — Mathematische Funktionen

import math

print(math.sqrt(16))       # 4.0
print(math.pi)             # 3.141592653589793
print(math.factorial(5))   # 120
print(math.ceil(4.2))      # 5
print(math.floor(4.8))     # 4

Siehe Python Math für eine vollständige Referenz.

random — Zufallszahlen

import random

print(random.randint(1, 10))          # random integer between 1 and 10
print(random.choice(["a", "b", "c"])) # random element
print(random.random())                 # float in [0.0, 1.0)

numbers = [1, 2, 3, 4, 5]
random.shuffle(numbers)
print(numbers)   # shuffled in place

datetime — Datum und Uhrzeit

import datetime

now = datetime.datetime.now()
print(now)                       # 2024-03-15 10:30:45.123456
print(now.year)                  # 2024
print(now.strftime("%B %d, %Y")) # March 15, 2024

today = datetime.date.today()
print(today)   # 2024-03-15

Siehe Python Dates für eine vollständige Abdeckung von Datumsarithmetik und -formatierung.

os und sys — Betriebssystem und Interpreter

import os

print(os.getcwd())              # current working directory
print(os.listdir("."))          # files in the current directory
os.makedirs("new_dir", exist_ok=True)  # create a directory
print(os.path.join("folder", "file.txt"))  # 'folder/file.txt'
import sys

print(sys.version)    # Python version string
print(sys.platform)   # 'linux', 'darwin', 'win32', etc.
sys.exit(0)           # terminate the program with exit code 0

json — JSON-Kodierung und -Dekodierung

import json

data = {"name": "Alice", "age": 30, "active": True}

# Python → JSON string
json_string = json.dumps(data, indent=2)
print(json_string)

# JSON string → Python
parsed = json.loads(json_string)
print(parsed["name"])   # Alice

Siehe Python JSON für dateibasiertes Lesen und Schreiben.

collections — Spezialisierte Datenstrukturen

from collections import Counter, defaultdict

# Count occurrences
words = ["apple", "banana", "apple", "cherry", "banana", "apple"]
counts = Counter(words)
print(counts)              # Counter({'apple': 3, 'banana': 2, 'cherry': 1})
print(counts.most_common(2))  # [('apple', 3), ('banana', 2)]

# Dict with default values
scores = defaultdict(int)
scores["Alice"] += 10
scores["Bob"] += 5
print(dict(scores))   # {'Alice': 10, 'Bob': 5}

Siehe Python Collections Module für namedtuple, deque und OrderedDict.

Ein eigenes Modul erstellen

Grundlegende Struktur

Module funktionieren am besten, wenn sie eine Sache gut erledigen. Eine gute Faustregel: Wenn eine Gruppe von Funktionen ein gemeinsames Thema hat, legen Sie sie in eine eigene Datei.

# mathutils.py

def clamp(value, minimum, maximum):
    """Restrict value to the range [minimum, maximum]."""
    return max(minimum, min(value, maximum))

def average(numbers):
    """Return the arithmetic mean of a list of numbers."""
    if not numbers:
        raise ValueError("Cannot average an empty list")
    return sum(numbers) / len(numbers)

def is_prime(n):
    """Return True if n is a prime number."""
    if n < 2:
        return False
    for i in range(2, int(n ** 0.5) + 1):
        if n % i == 0:
            return False
    return True
# main.py
from mathutils import clamp, average, is_prime

print(clamp(15, 0, 10))          # 10
print(average([2, 4, 6, 8]))     # 5.0
print(is_prime(17))              # True

Docstrings in Modulen

Fügen Sie ganz oben in der Datei einen Docstring auf Modulebene hinzu. Tools wie help() und Dokumentationsgeneratoren verwenden ihn.

"""
mathutils.py — Utility functions for common mathematical operations.

Functions:
    clamp(value, minimum, maximum) -> number
    average(numbers) -> float
    is_prime(n) -> bool
"""

Modulvariablen: __all__

__all__ ist eine Liste von Namen, die exportiert werden sollen, wenn jemand from module import * ausführt. Sie dient auch als Dokumentation über die öffentliche API des Moduls.

# mathutils.py
__all__ = ["clamp", "average", "is_prime"]

def _helper():   # leading underscore marks it as private
    pass

Ein Modul neu laden

Python speichert importierte Module in sys.modules zwischen. Das zweimalige Importieren desselben Moduls führt es nicht erneut aus — Python gibt die zwischengespeicherte Version zurück. Während der interaktiven Entwicklung oder beim Debuggen können Sie ein Neuladen erzwingen:

import importlib
import greetings

importlib.reload(greetings)

Dies wird hauptsächlich in REPL-Sitzungen oder Jupyter-Notebooks benötigt, nachdem eine Moduldatei bearbeitet wurde.

Häufige Fallstricke

Zirkuläre Importe

Wenn module_a module_b importiert und module_b module_a importiert, entsteht ein zirkulärer Import. Python kann einige zirkuläre Importe verarbeiten, aber sie sind verwirrend und deuten oft auf ein Designproblem hin. Die Lösung besteht normalerweise darin, den Code umzustrukturieren — die gemeinsame Logik in ein drittes Modul verschieben oder den Import in eine Funktion verlagern.

Eine Standardbibliothek verschatten

Wenn Sie Ihre Datei math.py, random.py oder json.py nennen, werden Sie das Standardbibliotheksmodul verschatten und jeden Code beschädigen, der es importiert. Verwenden Sie spezifische, beschreibende Namen für Ihre eigenen Module.

# BAD: naming your file math.py shadows the stdlib
# GOOD: name it mathutils.py or geometry.py

ImportError und ModuleNotFoundError

ModuleNotFoundError (eine Unterklasse von ImportError) bedeutet, dass Python das Modul nirgendwo auf sys.path finden konnte. Häufige Ursachen:

  • Ein Tippfehler im Modulnamen
  • Das Modul ist nicht installiert (pip install <package-name>)
  • Die Moduldatei befindet sich in einem Verzeichnis, das nicht auf sys.path steht
try:
    import nonexistent_module
except ModuleNotFoundError as e:
    print(f"Import failed: {e}")
    # Import failed: No module named 'nonexistent_module'

Module vs. Pakete

Ein Modul ist eine einzelne .py-Datei. Ein Paket ist ein Verzeichnis, das mehrere Module und eine __init__.py-Datei enthält. Pakete ermöglichen den Aufbau größerer Bibliotheken mit einer hierarchischen Struktur. Siehe Python Packages für die vollständige Erläuterung.

Populäre Drittanbieter-Module

Über die Standardbibliothek hinaus hat das Python-Ökosystem auf PyPI Hunderttausende von Paketen. Installieren Sie sie mit pip.

PaketZweck
numpyNumerisches Computing, mehrdimensionale Arrays
pandasDatenanalyse und -manipulation
matplotlibDatenvisualisierung und Diagrammerstellung
requestsHTTP-Anfragen leicht gemacht
flask / djangoWeb-Frameworks
scikit-learnMachine-Learning-Algorithmen
pytestTest-Framework

Übung

Übung
Which built-in variable tells you whether a Python file is being run directly or imported as a module?
Which built-in variable tells you whether a Python file is being run directly or imported as a module?
Was this page helpful?