Wiem, że da się to zrobić, ale nigdy nie pamiętam jak.
Jak możesz ponownie zaimportować moduł w Pythonie? Scenariusz wygląda następująco: importuję moduł interaktywnie i majstruje przy nim, ale potem napotyka błąd. Naprawiam błąd w pliku .py, a następnie chcę ponownie zaimportować naprawiony moduł bez wychodzenia z Pythona. Jak mogę to zrobić ?
Odpowiedzi:
To powinno działać:
Z dokumentacji Pythona
Jeśli korzystasz z Python 3.4 i nowszych, zrób
import importlib
, a następnie zróbimportlib.reload(nameOfModule)
.Nie zapomnij o zastrzeżeniach dotyczących tej metody:
Po ponownym załadowaniu modułu jego słownik (zawierający zmienne globalne modułu) zostaje zachowany. Ponowne zdefiniowanie nazw zastąpi stare definicje, więc ogólnie nie stanowi to problemu, ale jeśli nowa wersja modułu nie definiuje nazwy zdefiniowanej przez starą wersję, stara definicja nie jest usuwana.
Jeśli moduł importuje obiekty z innego modułu za pomocą
from ... import ...
, wywołaniereload()
drugiego modułu nie przedefiniuje obiektów importowanych z niego - jednym z nich jest ponowne wykonaniefrom
instrukcji, innym zamiast nich jest użycieimport
nazw kwalifikowanych (module.*name*
).Jeśli moduł tworzy instancje klasy, przeładowanie modułu, który definiuje klasę, nie wpływa na definicje metod instancji - nadal używają starej definicji klasy. To samo dotyczy klas pochodnych.
źródło
from filename import *
. Jak przeładować?import foo; from foo import bar; reload(foo)
W Pythonie 3
reload
nie jest już funkcją wbudowaną.Jeśli używasz Python 3.4+, powinieneś użyć
reload
zimportlib
biblioteki:Jeśli używasz Pythona 3.2 lub 3.3, powinieneś:
zamiast. Zobacz http://docs.python.org/3.0/library/imp.html#imp.reload
Jeśli używasz
ipython
, zdecydowanie rozważ użycieautoreload
rozszerzenia:źródło
imp.reload
jest przestarzałe od Python 3.4, zamiast tego użyjimportlib.reload
funkcji .from mymodule import myfunc
, toimportlib.reload(myfunc)
,importlib.reload(mymodule.myfunc)
,importlib.reload(mymodule)
wszystkie dają NameError.W rzeczywistości w Pythonie 3 moduł
imp
jest oznaczony jako DEPRECATED. Przynajmniej tak jest w przypadku 3.4.Zamiast tego należy użyć
reload
funkcji zimportlib
modułu:https://docs.python.org/3/library/importlib.html#importlib.reload
Należy jednak pamiętać, że w tej bibliotece wprowadzono pewne zmiany interfejsu API w dwóch ostatnich mniejszych wersjach.
źródło
Jeśli chcesz zaimportować określoną funkcję lub klasę z modułu, możesz to zrobić:
źródło
Mimo że podane odpowiedzi działają dla określonego modułu, nie załadują ponownie podmodułów, jak zauważono w tej odpowiedzi :
Jeśli jednak używasz
__all__
zmiennej do zdefiniowania publicznego API, możliwe jest automatyczne przeładowanie wszystkich publicznie dostępnych modułów:Zastrzeżenia odnotowane w poprzedniej odpowiedzi są jednak nadal aktualne. W szczególności na modyfikację podmodułu, który nie jest częścią publicznego API, jak opisano w
__all__
zmiennej, nie będzie miało wpływu przeładowanie za pomocą tej funkcji. Podobnie usunięcie elementu submodułu nie zostanie odzwierciedlone przez przeładowanie.źródło