Zum Inhalt springen
aviral gupta

// B5.1 · ca. 25 Min. · Einstieg

Module und Importe

Nach dieser Lektion teilen Sie ein Programm in main.py und ein Modul helpers.py auf, importieren es in der passenden Form und schützen Skript-Code mit if __name__ == "__main__":.

Lektion 1 von 5 in B5 Module, Dateien und Fehler

Anfang des Moduls

Danach können Sie

  • Ein Modul oder einzelne Namen daraus mit import und from … import einbinden
  • Ein Programm auf main.py und eine zweite Datei aufteilen, Skript-Code mit if __name__ == "__main__": geschützt
  • Mit dir() auflisten, was ein Modul definiert, und erklären, wo Python ein Modul sucht
  1. Aufwärmen · Aufgabe 1 von 7

    Ein Modul ist meist eine Datei voller Funktionen. Aufwärmen aus Modul B3: Welche Aussagen über def stimmen? Wählen Sie alle zutreffenden.

    Wählen Sie alle zutreffenden aus.

  2. Vorhersagen · Aufgabe 2 von 7

    Sagen Sie es vorher, bevor Sie weiterlesen. dir() ohne Argument listet die Namen, die in dieser Datei definiert sind. Was gibt das aus?

    from math import sqrt
    
    print(sqrt(25), "math" in dir())
  3. Üben · Aufgabe 3 von 7

    Setzen Sie das Schlüsselwort ein, damit der Name math auf das ganze Modul math verweist.

    ____ math
    math
  4. Üben · Aufgabe 4 von 7

    Diese Datei heißt main.py und wird mit python main.py gestartet. Was gibt sie aus?

    print("name is", __name__)
  5. Üben · Aufgabe 5 von 7

    Ordnen Sie jedem Import den Namen oder die Namen zu, die er liefert.

  6. Denksport · Aufgabe 6 von 7

    Knobelaufgabe. Was gibt das aus?

    from math import pi
    
    pi = 3
    
    import math
    print(pi, math.pi > 3)
  7. Anwenden · Aufgabe 7 von 7

    Mini-Aufgabe, auf Ihrem eigenen Rechner. Legen Sie temperature.py an, mit einer Funktion c_to_f(celsius), die celsius * 9 / 5 + 32 zurückgibt, und einem Selbsttest unter if __name__ == "__main__":. Importieren Sie das Modul dann in main.py im selben Ordner und geben Sie für 0, 20 und 100 je eine Zeile wie 0 C = 32.0 F aus. Starten Sie beide Dateien.

    Prüfen Sie Ihr Ergebnis anhand dieser Liste

Selbst programmieren

Lesen Sie das ausgearbeitete Beispiel und lösen Sie dann die Übungen. Ihr Code läuft in Ihrem Browser oder auf Ihrem Computer und wird nie hochgeladen.

Ausgearbeitetes Beispiel

Ein Hauptprogramm und sein Hilfsmodul

Zwei Dateien liegen nebeneinander: helpers.py definiert zwei Textfunktionen, und main.py importiert sie in beiden Formen. helpers.py gibt auf oberster Ebene eine Zeile aus, damit Sie sehen, wann es läuft, und hält seinen Selbsttest hinter der __main__-Abfrage. Starten Sie main.py und sehen Sie nach, welche Zeilen von helpers.py erschienen sind.

main.py

import helpers
from helpers import word_count

sentence = "modules keep programs tidy"

print(helpers.shout(sentence))
print("words:", word_count(sentence))
print("helpers.__name__ is", helpers.__name__)
print("__name__ here is", __name__)
print([name for name in dir(helpers) if not name.startswith("_")])

helpers.py

"""Small text helpers, imported by main.py."""


def shout(text: str) -> str:
    return text.upper() + "!"


def word_count(text: str) -> int:
    return len(text.split())


print("loading helpers")

if __name__ == "__main__":
    # Runs only with: python helpers.py
    print("self-test:", shout("hi"), word_count("a b c"))

Ausführen mit

python main.py

Ausgabe

loading helpers
MODULES KEEP PROGRAMS TIDY!
words: 4
helpers.__name__ is helpers
__name__ here is __main__
['shout', 'word_count']
  • loading helpers erscheint einmal, obwohl main.py helpers zweimal importiert: Code auf oberster Ebene läuft nur beim ersten Import.
  • Der Selbsttest lief nicht, weil __name__ von helpers.py beim Import "helpers" ist.
  • main.py nutzt helpers.shout mit dem Modulnamen, word_count aber allein, weil es mit from importiert wurde.
  • dir(helpers) listet auch Namen wie __name__ und __doc__; die List Comprehension verwirft alles, was mit _ beginnt.
Ändern und ausführen

Tab rückt ein, Umschalt+Tab rückt aus. Um den Editor mit der Tastatur zu verlassen, drücken Sie Esc und dann Tab.

Beim ersten Ausführen lädt Ihr Browser Python herunter (bis zu 6.5 MB) und speichert es im Cache. Ihr Code bleibt auf Ihrem Gerät.

Übungen

Übung 1 von 2

Das Modul helpers nutzen

helpers.py (zweiter Reiter) definiert average(scores) und grade(score). Lassen Sie die Datei unverändert. Lesen Sie in main.py eine Zeile ganzzahliger Punktzahlen, durch Leerzeichen getrennt, und geben Sie average: mit dem Durchschnitt und grade: mit der Note aus. Verwenden Sie import helpers für average und from helpers import grade für grade. Für 80 65 lautet die Ausgabe average: 72.5 und grade: C.

Tab rückt ein, Umschalt+Tab rückt aus. Um den Editor mit der Tastatur zu verlassen, drücken Sie Esc und dann Tab.

Beim ersten Ausführen lädt Ihr Browser Python herunter (bis zu 6.5 MB) und speichert es im Cache. Ihr Code bleibt auf Ihrem Gerät.

Hinweise
  1. Hinweis 1

    Beginnen Sie main.py mit zwei Zeilen: import helpers, dann from helpers import grade.

  2. Hinweis 2

    Nach import helpers erreichen Sie average über das Modul: helpers.average(scores). grade rufen Sie allein auf: grade(mean).

  3. Hinweis 3

    print("average:", mean) setzt das Leerzeichen zwischen Beschriftung und Zahl von selbst.

Eine Lösung zeigen

Ein möglicher Lösungsweg. Ihrer kann anders aussehen und trotzdem alle Prüfungen bestehen.

import helpers
from helpers import grade

scores = [int(word) for word in input().split()]
mean = helpers.average(scores)
print("average:", mean)
print("grade:", grade(mean))
Auf dem eigenen Computer ausführen

Installieren Sie Python 3.14 oder neuer. Speichern Sie diese Dateien in einem Ordner, öffnen Sie dort ein Terminal und führen Sie die Befehle unten aus.

main.py

# helpers.py, next to this file, defines average(scores) and grade(score).
# Import them, then print the average and the grade of the scores typed in.
scores = [int(word) for word in input().split()]
print("average:", 0)

test_main.py

from learnrun import run_main


def report(line):
    return run_main(line + "\n").strip().splitlines()


def test_average_and_grade():
    """80 65 ergibt Durchschnitt 72.5 und Note C"""
    got = report("80 65")
    assert got == ["average: 72.5", "grade: C"], f"für 80 65 gab das Programm {got!r} aus"


def test_top_grade():
    """90 100 ergibt Durchschnitt 95.0 und Note A"""
    got = report("90 100")
    assert got == ["average: 95.0", "grade: A"], f"für 90 100 gab das Programm {got!r} aus"


def test_uses_helpers():
    """main.py importiert helpers, statt die Funktionen zu kopieren"""
    with open("main.py", encoding="utf-8") as f:
        source = f.read()
    assert "import helpers" in source, "in main.py fehlt die Zeile import helpers"
    assert "from helpers import grade" in source, "in main.py fehlt die Zeile from helpers import grade"
    assert "def " not in source, "main.py definiert eine eigene Funktion; nutzen Sie die aus helpers.py"

helpers.py

"""Score helpers for main.py. Leave this file as it is."""


def average(scores: list[int]) -> float:
    return sum(scores) / len(scores)


def grade(score: float) -> str:
    if score >= 90:
        return "A"
    if score >= 75:
        return "B"
    if score >= 50:
        return "C"
    return "F"

Unter macOS und Linux tippen Sie python3, wo in diesen Befehlen python steht, wie in der ersten Lektion.

Programm ausführen:

python main.py

Prüfungen ausführen (learnrun.py muss im selben Ordner liegen):

python learnrun.py test
learnrun.py herunterladen

Übung 2 von 2

main.py importierbar machen

main.py definiert greet(name), das shout aus helpers.py nutzt, fragt dann nach einem Namen und gibt den Gruß aus. Die Tests importieren main.py, um greet aufzurufen, und dabei darf nichts gelesen oder ausgegeben werden. Verschieben Sie die input- und print-Zeilen unter if __name__ == "__main__":, damit sie nur laufen, wenn main.py selbst gestartet wird.

Tab rückt ein, Umschalt+Tab rückt aus. Um den Editor mit der Tastatur zu verlassen, drücken Sie Esc und dann Tab.

Beim ersten Ausführen lädt Ihr Browser Python herunter (bis zu 6.5 MB) und speichert es im Cache. Ihr Code bleibt auf Ihrem Gerät.

Hinweise
  1. Hinweis 1

    Wenn ein Test main.py importiert, ist dessen __name__ gleich "main". Wenn Sie es starten, ist __name__ gleich "__main__".

  2. Hinweis 2

    Fügen Sie unten die Zeile if __name__ == "__main__": ein und rücken Sie die beiden Zeilen darunter um vier Leerzeichen ein.

  3. Hinweis 3

    Lassen Sie das def, wo es ist: Die Tests brauchen greet nach dem Import.

Eine Lösung zeigen

Ein möglicher Lösungsweg. Ihrer kann anders aussehen und trotzdem alle Prüfungen bestehen.

from helpers import shout


def greet(name: str) -> str:
    return shout("hello, " + name)


if __name__ == "__main__":
    name = input()
    print(greet(name))
Auf dem eigenen Computer ausführen

Installieren Sie Python 3.14 oder neuer. Speichern Sie diese Dateien in einem Ordner, öffnen Sie dort ein Terminal und führen Sie die Befehle unten aus.

main.py

from helpers import shout


def greet(name: str) -> str:
    return shout("hello, " + name)


name = input()
print(greet(name))

test_main.py

import contextlib
import importlib
import io
import sys

from learnrun import run_main


def import_main():
    sys.modules.pop("main", None)
    printed = io.StringIO()
    saved = sys.stdin
    sys.stdin = io.StringIO("")
    try:
        with contextlib.redirect_stdout(printed):
            module = importlib.import_module("main")
    finally:
        sys.stdin = saved
    return module, printed.getvalue()


def test_import_is_quiet():
    """Der Import von main.py liest keine Eingabe und gibt nichts aus"""
    try:
        _, printed = import_main()
    except EOFError:
        assert False, "beim Import von main.py lief input(): verschieben Sie es unter if __name__ == \"__main__\":"
    assert printed == "", f"beim Import gab main.py {printed!r} aus: verschieben Sie das print unter if __name__ == \"__main__\":"


def test_greet():
    """greet(\"ada\") gibt HELLO, ADA! zurück"""
    try:
        module, _ = import_main()
    except EOFError:
        assert False, "main.py ließ sich nicht importieren: es ruft input() auf oberster Ebene auf"
    got = module.greet("ada")
    assert got == "HELLO, ADA!", f"greet(\"ada\") gab {got!r} zurück, erwartet war 'HELLO, ADA!'"


def test_run_as_script():
    """Als Skript gestartet, fragt es weiter nach einem Namen und grüßt"""
    got = run_main("Grace\n").strip()
    assert got == "HELLO, GRACE!", f"für Grace gab das Programm {got!r} aus, erwartet war 'HELLO, GRACE!'"

helpers.py

"""Text helpers for main.py. Leave this file as it is."""


def shout(text: str) -> str:
    return text.upper() + "!"

Unter macOS und Linux tippen Sie python3, wo in diesen Befehlen python steht, wie in der ersten Lektion.

Programm ausführen:

python main.py

Prüfungen ausführen (learnrun.py muss im selben Ordner liegen):

python learnrun.py test
learnrun.py herunterladen

Häufige Fehler

Den Dateinamen in den Import schreiben

import math.py

print(math.sqrt(16))

Was Python ausgibt

ModuleNotFoundError: No module named 'math.py'; 'math' is not a package

Warum, und die Lösung

import erwartet einen Modulnamen, keinen Dateinamen. Python liest math.py als „das Modul py im Paket math“, und das gibt es nicht. Schreiben Sie import math, oder import helpers für Ihre eigene helpers.py.

Den Modulnamen nach from … import benutzen

from math import sqrt

print(math.sqrt(16))

Was Python ausgibt

NameError: name 'math' is not defined. Did you forget to import 'math'?

Warum, und die Lösung

from math import sqrt definiert nur sqrt, nicht math. Rufen Sie entweder sqrt(16) direkt auf, oder ändern Sie den Import in import math und behalten Sie math.sqrt(16). Wählen Sie pro Modul eine Form und bleiben Sie dabei.

Eine Funktion ohne ihren Modulnamen aufrufen

import math

print(sqrt(16))

Was Python ausgibt

NameError: name 'sqrt' is not defined

Warum, und die Lösung

import math bindet nur den Namen math. Seine Funktionen bleiben darin: Schreiben Sie math.sqrt(16). Wenn Sie den kurzen Namen wollen, importieren Sie ihn: from math import sqrt.

Python im Browser: Pyodide 314.0.7, MPL-2.0. Lizenz und Quellcode

Abschlussquiz

5 Fragen, ohne Hinweise. Ab 80 % ist die Lektion abgeschlossen.

Erledigen Sie zuerst alle Aufgaben oben, um das Abschlussquiz freizuschalten.

Problem melden

Etwas ist falsch oder unklar? Beschreiben Sie es kurz, dann wird es geprüft und korrigiert.

#

Mindestens 20 Zeichen.

Nur, wenn Sie eine Antwort wünschen.

Kernideen

Zwei Arten zu importieren

Ein Modul ist eine Datei mit Python-Definitionen: helpers.py ist das Modul helpers. import helpers liefert einen neuen Namen, helpers, und an den Inhalt kommen Sie mit einem Punkt: helpers.shout("hi"). from helpers import shout übernimmt nur den Namen shout in Ihre Datei. Sie rufen dann shout("hi") auf, aber der Name helpers selbst ist nicht definiert. import math as m bindet das Modul unter einem kürzeren Namen. Schreiben Sie nie .py in einen Import: Die Anweisung erwartet einen Modulnamen, keinen Dateinamen.

Code auf oberster Ebene läuft einmal, und __name__ sagt warum

Beim Import führt Python den Code auf oberster Ebene eines Moduls aus, und zwar nur beim ersten Import. In jedem Modul enthält die Variable __name__ dessen Namen: "helpers", wenn es importiert wird, aber "__main__", wenn Sie die Datei selbst mit python helpers.py starten. Code unter if __name__ == "__main__": läuft also, wenn Sie die Datei starten, und nicht, wenn eine andere Datei sie importiert. Demos, input() und print() gehören dorthin; dann taugt die Datei als Skript und als Modul.

dir() und der Suchpfad für Module

dir(helpers) liefert eine sortierte Liste der Namen, die helpers definiert, auch Dunder-Namen wie __name__. Filtern Sie Namen mit _ am Anfang heraus, dann sehen Sie die Funktionen. dir() ohne Argument listet die Namen Ihrer eigenen Datei. Beim Suchen prüft Python zuerst die eingebauten Module, dann die Ordner in der Liste sys.path. Der erste Ordner ist der des gestarteten Skripts; darum muss helpers.py neben main.py liegen. Passt nichts, gibt es ModuleNotFoundError.

Quellen

Zuletzt geprüft am 29. September 2026