588 Stimmen

Reimport eines Moduls in Python im interaktiven Betrieb

Ich weiß, dass es möglich ist, aber ich weiß nicht mehr, wie das geht.

Wie kann man ein Modul in Python reimportieren? Das Szenario ist wie folgt: Ich importiere ein Modul interaktiv und bastle daran herum, aber dann tritt ein Fehler auf. Ich behebe den Fehler in der .py-Datei und möchte dann das reparierte Modul wieder importieren, ohne Python zu beenden. Wie kann ich das tun?

587voto

Benjamin Wohlwend Punkte 29432

Para Python 3.4+ :

import importlib
importlib.reload(nameOfModule)

Para Python < 3.4 :

reload(my.module)

Von der Python-Dokumente

Laden Sie ein zuvor importiertes Modul erneut. Das Argument muss ein Modulobjekt sein, d.h. es muss zuvor erfolgreich importiert worden sein. Dies ist nützlich, wenn Sie die Quelldatei des Moduls mit einem externen Editor bearbeitet haben und die neue Version ausprobieren möchten, ohne den Python-Interpreter zu verlassen.

Vergessen Sie nicht, dass diese Methode mit einigen Vorbehalten behaftet ist:

  • Wenn ein Modul neu geladen wird, bleibt sein Wörterbuch (mit den globalen Variablen des Moduls) erhalten. Neudefinitionen von Namen setzen die alten Definitionen außer Kraft, so dass dies im Allgemeinen kein Problem darstellt. Wenn jedoch die neue Version eines Moduls einen Namen nicht definiert, der in der alten Version definiert war, wird die alte Definition nicht entfernt.

  • 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 ein Modul Instanzen einer Klasse instanziiert, wirkt sich ein erneutes Laden des Moduls, das die Klasse definiert, nicht auf die Methodendefinitionen der Instanzen aus - sie verwenden weiterhin die alte Klassendefinition. Das Gleiche gilt für abgeleitete Klassen.

356voto

Andrew Punkte 4161

In Python 3, reload ist nicht länger eine eingebaute Funktion.

Wenn Sie Python 3.4+ verwenden, sollten Sie reload von der importlib stattdessen die Bibliothek:

import importlib
importlib.reload(some_module)

Wenn Sie Python 3.2 oder 3.3 verwenden, sollten Sie das tun:

import imp  
imp.reload(module)  

stattdessen. Siehe http://docs.python.org/3.0/library/imp.html#imp.reload

Wenn Sie Folgendes verwenden ipython sollten Sie auf jeden Fall die Verwendung des autoreload Erweiterung:

%load_ext autoreload
%autoreload 2

47voto

jss367 Punkte 3707

Wenn Sie eine bestimmte Funktion oder Klasse aus einem Modul importieren möchten, können Sie dies tun:

import importlib
import sys
importlib.reload(sys.modules['my_module'])
from my_module import my_function

46voto

funky-future Punkte 3289

In Python 3 ist das Modul imp ist als DEPRECATED gekennzeichnet. Nun, zumindest gilt das für 3.4.

Stattdessen wird die reload Funktion aus der importlib Modul verwendet werden sollte:

https://docs.python.org/3/library/importlib.html#importlib.reload

Beachten Sie aber, dass diese Bibliothek in den letzten beiden Minor-Versionen einige API-Änderungen erfahren hat.

16voto

Laryx Decidua Punkte 7673

Ein weiterer kleiner Punkt: Wenn Sie die import some_module as sm Syntax, dann müssen Sie das Modul mit seiner Aliasname ( sm in diesem Beispiel):

>>> import some_module as sm
...
>>> import importlib
>>> importlib.reload(some_module) # raises "NameError: name 'some_module' is not defined"
>>> importlib.reload(sm) # works

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X