Ich weiß, dass es möglich ist, aber ich kann mich nie erinnern, wie.
Wie können Sie ein Modul in Python erneut importieren? Das Szenario ist wie folgt: Ich importiere ein Modul interaktiv und bastele daran, aber dann tritt ein Fehler auf. Ich behebe den Fehler in der .py-Datei und möchte das feste Modul erneut importieren, ohne Python zu beenden. Wie kann ich es tun ?
Antworten:
Das sollte funktionieren:
Aus den Python-Dokumenten
Wenn Sie Python 3.4 oder höher ausführen, tun Sie
import importlib
diesimportlib.reload(nameOfModule)
.Vergessen Sie nicht die Vorbehalte bei dieser Methode:
Wenn ein Modul neu geladen wird, bleibt sein Wörterbuch (das die globalen Variablen des Moduls enthält) erhalten. Neudefinitionen von Namen überschreiben die alten Definitionen, sodass dies im Allgemeinen kein Problem darstellt. Wenn die neue Version eines Moduls jedoch keinen Namen definiert, der von der alten Version definiert wurde, wird die alte Definition nicht entfernt.
Wenn ein Modul Objekte aus einem anderen Modul importiert
from ... import ...
, indem esreload()
das andere Modul aufruft, werden die daraus importierten Objekte nicht neu definiert. Eine Möglichkeit besteht darin, diefrom
Anweisung erneut auszuführen , eine andere darin, stattdessenimport
names (module.*name*
) zu verwenden.Wenn ein Modul Instanzen einer Klasse instanziiert, wirkt sich das erneute Laden des Moduls, das die Klasse definiert, nicht auf die Methodendefinitionen der Instanzen aus. Sie verwenden weiterhin die alte Klassendefinition. Gleiches gilt für abgeleitete Klassen.
quelle
from filename import *
. Wie lade ich nach?import foo; from foo import bar; reload(foo)
In Python 3
reload
ist keine Funktion mehr eingebaut.Wenn Sie Python 3.4+ verwenden, sollten Sie stattdessen Folgendes
reload
aus derimportlib
Bibliothek verwenden:Wenn Sie Python 3.2 oder 3.3 verwenden, sollten Sie:
stattdessen. Siehe http://docs.python.org/3.0/library/imp.html#imp.reload
Wenn Sie verwenden
ipython
, sollten Sie auf jeden Fall dieautoreload
Erweiterung in Betracht ziehen :quelle
imp.reload
ist seit Python 3.4 veraltet. Verwenden Sie stattdessen dieimportlib.reload
Funktion .from mymodule import myfunc
, dannimportlib.reload(myfunc)
,importlib.reload(mymodule.myfunc)
,importlib.reload(mymodule)
alle einen Nameerror geben.Tatsächlich ist das Modul in Python 3
imp
als DEPRECATED markiert. Nun, zumindest gilt das für 3.4.Stattdessen sollte die
reload
Funktion aus demimportlib
Modul verwendet werden:https://docs.python.org/3/library/importlib.html#importlib.reload
Beachten Sie jedoch, dass diese Bibliothek einige API-Änderungen mit den letzten beiden Nebenversionen hatte.
quelle
Wenn Sie eine bestimmte Funktion oder Klasse aus einem Modul importieren möchten, gehen Sie folgendermaßen vor:
quelle
Obwohl die bereitgestellten Antworten für ein bestimmtes Modul funktionieren, werden Submodule nicht neu geladen, wie in Diese Antwort angegeben :
Wenn Sie jedoch die
__all__
Variable zum Definieren der öffentlichen API verwenden, können Sie alle öffentlich verfügbaren Module automatisch neu laden:Die in der vorherigen Antwort genannten Einschränkungen gelten jedoch weiterhin. Insbesondere das Ändern eines Submoduls, das nicht Teil der öffentlichen API ist, wie von der
__all__
Variablen beschrieben, wird durch ein erneutes Laden mit dieser Funktion nicht beeinflusst. Ebenso wird das Entfernen eines Elements eines Submoduls nicht durch ein erneutes Laden wiedergegeben.quelle