Wie kann man in Jupyter Notebook ein Modul neu laden, nachdem es importiert wurde?

Melden
  1. Standardimport und dessen Grenzen
  2. Modul mit importlib neu laden
  3. Besonderheiten bei "from ... import ..." Statements
  4. Praktische Tipps für den Alltag im Jupyter Notebook

In Jupyter Notebook arbeitet man oft mit Modulen, die man selbst geschrieben hat oder die sich während einer Sitzung ändern können. Wenn man ein Modul einmal importiert hat, bleiben die Inhalte dieses Moduls im Speicher des Notebooks erhalten. Das bedeutet, dass Änderungen im Quellcode des Moduls nach dem ersten Import nicht automatisch im Notebook wirksam werden. Deshalb stellt sich die Frage, wie man ein Modul neu laden kann, um die aktuellen Änderungen zu übernehmen, ohne das gesamte Notebook neu zu starten.

Standardimport und dessen Grenzen

Der typische Import erfolgt mit dem Befehl import modulname oder from modulname import funktion. Dies lädt das Modul einmal in den Speicher. Wenn man den Code des Moduls außerhalb des Notebooks verändert, wird diese Änderung nicht wirksam, wenn man den Import erneut ausführt, da Python das Modul beim zweiten Import nicht nochmals lädt, sondern die bereits geladene Version aus dem Cache verwendet.

Modul mit importlib neu laden

Ab Python 3.4 gibt es das Modul importlib, mit dem man ein bereits importiertes Modul explizit neu laden kann. Dafür importiert man zuerst das Modul ganz normal, z.B. import meinmodul, und lädt es anschließend mit importlib.reload(meinmodul) neu. Dadurch wird das Modul erneut eingelesen und die Änderungen werden sichtbar.

Ein Beispiel:

import importlibimport meinmodul# Änderungen im meinmodul.py vornehmen und speichernimportlib.reload(meinmodul)

Wichtig ist, dass reload immer das Modul-Objekt erwartet, das bereits importiert wurde. Es reicht nicht aus, nur importlib.reload(meinmodul) aufzurufen, da hier ein Modulobjekt benötigt wird.

Besonderheiten bei "from ... import ..." Statements

Wenn man Funktionen oder Klassen direkt mit from modul import funktion importiert, werden diese symbolischen Verweise im Notebook einmalig gesetzt. Ein Reload des Moduls aktualisiert zwar das Modul selbst, ersetzt aber nicht automatisch diese einzelnen Namen im aktuellen Namensraum. In solchen Fällen muss man die Funktion oder Klasse nach dem Reload erneut importieren, damit die Änderung wirksam wird.

Praktische Tipps für den Alltag im Jupyter Notebook

Für die Arbeit im Jupyter Notebook empfiehlt es sich, die Module mit import modulname zu importieren und nach Änderungen importlib.reload(modulname) auszuführen. So lassen sich auch komplexe Änderungen an Klassen und Funktionen gut testen. Wer häufig Module ändert, kann sich ggf. an sogenannte "autoreload"-Funktionen aus IPython oder Jupyter Extensions halten, die den Neuladevorgang automatisieren.

Zusammenfassend gilt: Ein einfaches erneutes Importieren lädt ein bereits importiertes Modul nicht erneut. Stattdessen verwendet man importlib.reload(), um ein Modul im laufenden Notebook neu zu laden und Änderungen sichtbar zu machen.

0

Kommentare