Obwohl die bereitgestellten Antworten für ein bestimmtes Modul funktionieren, werden sie keine Untermodule neu laden, wie in Diese Antwort :
Wenn ein Modul Objekte aus einem anderen Modul importiert, indem es from ... import ...
, Aufruf reload()
für das andere Modul definiert die von ihm importierten Objekte nicht neu - eine Möglichkeit, dies zu umgehen, ist die erneute Ausführung der from-Anweisung, eine andere ist die Verwendung von import
und qualifizierte Namen ( module.*name*
) statt.
Wenn Sie jedoch die __all__
Variable zur Definition der öffentlichen API ist es möglich, alle öffentlich verfügbaren Module automatisch neu zu laden:
# Python >= 3.5
import importlib
import types
def walk_reload(module: types.ModuleType) -> None:
if hasattr(module, "__all__"):
for submodule_name in module.__all__:
walk_reload(getattr(module, submodule_name))
importlib.reload(module)
walk_reload(my_module)
Die in der vorangegangenen Antwort genannten Vorbehalte sind jedoch nach wie vor gültig. Insbesondere ist das Ändern eines Submoduls, das nicht Teil der öffentlichen API ist, wie in der __all__
Variable wird durch ein Neuladen mit dieser Funktion nicht beeinträchtigt. Ebenso wird das Entfernen eines Elements eines Submoduls nicht durch ein Neuladen reflektiert.