2009-08-10 13 views
205

Wiem, że można to zrobić, ale nigdy nie pamiętam jak.Ponownie zaimportuj moduł do pythonu podczas interakcji

W jaki sposób można ponownie importować moduł do Pythona? Scenariusz wygląda następująco: Importuję moduł interaktywnie i majstruje nim, ale potem pojawia się błąd. Naprawię błąd w pliku .py, a następnie chcę ponownie zaimportować poprawiony moduł bez zamykania Pythona. Jak mogę to zrobić ?

+1

Możliwy duplikat [Jak mogę wyładować (przeładować) moduł Pythona?] (Http://stackoverflow.com/questions/437589/how-do-i-unload-reload-a-python-module) – Walter

+0

[ reimport python module] (https://stackoverflow.com/a/437591/6521116) –

Odpowiedz

204

To powinno działać:

reload(my.module) 

Z Python docs

Odśwież uprzednio importowanego modułu. Argument musi być obiektem modułu, więc wcześniej musiał zostać pomyślnie zaimportowany. Jest to przydatne, jeśli edytujesz plik źródłowy modułu za pomocą zewnętrznego edytora i chcesz wypróbować nową wersję bez opuszczania interpretera Pythona.

+48

** Nie zapomnij o zastrzeżeniach związanych z użyciem tej metody **: kiedy moduł jest przeładowywany, jego słownik (zawierający globalne zmienne modułu) ** zostaje zachowane **. Ponowne definicje nazw zastąpią stare definicje, więc generalnie nie stanowi to problemu. Jeśli nowa wersja modułu nie definiuje nazwy zdefiniowanej przez starą wersję, stara definicja pozostaje. – nosklo

+46

** Nie zapomnij o zastrzeżeniach związanych z użyciem tej metody **: Jeśli moduł importuje obiekty z innego modułu używając 'from ... import ...', wywołanie 'reload()' dla drugiego modułu ** nie przedefiniować obiekty zaimportowane z niego ** - jednym sposobem obejścia tego jest ponowne wykonanie instrukcji 'from', innym jest użycie nazw' import' i kwalifikowanych ('module. * nazwa *'). – nosklo

+41

** Nie zapomnij o zastrzeżeniach dotyczących stosowania tej metody **: Jeśli moduł tworzy instancje klasy, przeładowanie modułu, który definiuje klasę **, nie ma wpływu na definicje metod instancji ** - one ** kontynuują aby użyć * starej * definicji klasy **. To samo dotyczy klas pochodnych. – nosklo

138

W pythonie 3, reload nie jest już wbudowaną funkcją.

Jeśli używasz Pythona 3.4+ należy użyć reload z importlib biblioteki zamiast:

import importlib 
importlib.reload(some_module) 

Jeśli używasz Pythona 3.2 lub 3.3 należy:

import imp 
imp.reload(module) 

zamiast. Zobacz http://docs.python.org/3.0/library/imp.html#imp.reload

Jeśli używasz ipython, zdecydowanie rozważyć użycie rozszerzenie autoreload:

%load_ext autoreload 
%autoreload 2 
+0

Chociaż wiele Python kod jest napisany w Pythonie 2, Python 3 staje się bardziej opłacalna opcja każdego dnia. Dzięki za wskazówkę! –

+32

'imp.reload' jest przestarzałe od Pythona 3.4, zamiast tego użyj funkcji' 'importlib.reload' (http://docs.python.org/3.4/library/importlib.html#importlib.reload). – jfs

Powiązane problemy