reload(module)
aber nur, wenn sie völlig eigenständig ist. Wenn irgendetwas anderes einen Verweis auf das Modul (oder ein zum Modul gehörendes Objekt) hat, dann werden Sie subtile und merkwürdige Fehler erhalten, die dadurch verursacht werden, dass der alte Code länger als erwartet herumhängt, und Dinge wie isinstance
nicht über verschiedene Versionen desselben Codes hinweg funktioniert.
Wenn Sie einseitige Abhängigkeiten haben, müssen Sie auch alle Module neu laden, die von dem neu geladenen Modul abhängen, um alle Verweise auf den alten Code zu entfernen. Und dann laden Sie die Module, die von den neu geladenen Modulen abhängen, rekursiv neu.
Wenn Sie zirkuläre Abhängigkeiten haben, was z. B. beim Nachladen eines Pakets sehr häufig vorkommt, müssen Sie alle Module der Gruppe in einem Zug entladen. Sie können dies nicht tun mit reload()
weil es jedes Modul neu importiert, bevor seine Abhängigkeiten aktualisiert wurden, wodurch sich alte Referenzen in neue Module einschleichen können.
Die einzige Möglichkeit, dies zu tun, besteht darin, Folgendes zu hacken sys.modules
was irgendwie nicht unterstützt wird. Sie müssten durchgehen und jede einzelne Datei löschen. sys.modules
Eintrag, der beim nächsten Import neu geladen werden soll, und löschen Sie auch Einträge, deren Werte None
um ein Implementierungsproblem zu lösen, das mit der Zwischenspeicherung fehlgeschlagener relativer Importe zu tun hat. Es ist nicht sonderlich schön, aber solange man einen vollständig in sich geschlossenen Satz von Abhängigkeiten hat, der keine Referenzen außerhalb seiner Codebasis hinterlässt, ist es machbar.
Es ist wahrscheinlich am besten, den Server neu zu starten :-)