logo

Ponowne ładowanie modułów w Pythonie

Mamy przypadek, w którym chcemy zaktualizować i przetestować moduł Pythona bez ponownego uruchamiania interpretera. Jest to szczególnie przydatne podczas programowania, gdy modyfikujesz pliki modułów zewnętrznie i chcesz, aby te zmiany zostały natychmiast odzwierciedlone. Python pozwala nam ponownie załadować wcześniej zaimportowany moduł za pomocą funkcji reload(). Na przykład jeśli edytowałeś plik narzędzia utils.py podczas działania skryptu, ponowne załadowanie pozwala na ponowne zaimportowanie zaktualizowanej zawartości bez ponownego uruchamiania powłoki Pythona.

Kiedy należy ponownie załadować moduł?

  • Podczas debugowania lub testowania na żywo
  • Podczas korzystania z interaktywnych interpreterów, takich jak IPython lub Jupyter
  • Podczas tworzenia wtyczek lub systemów modułowych
  • Aby odzwierciedlić zmiany wprowadzone w zewnętrznych plikach .py bez ponownego uruchamiania sesji

Ponowne ładowanie modułów w Pythonie 2.x

W Pythonie 2.x możesz bezpośrednio użyć wbudowanej funkcji reload() do ponownego załadowania modułu, który został wcześniej zaimportowany.

Python
import mymodule # Modify 'mymodule.py' externally here... reload(mymodule) 

Wyjaśnienie:



  • mymodule jest najpierw importowany za pomocą importu.
  • Po dokonaniu zewnętrznych zmian w mymodule.py wywołanie reload(mymodule) powoduje ponowne załadowanie zaktualizowanej wersji bez ponownego uruchamiania interpretera.
  • Nie ma potrzeby ponownego importowania — reload() działa na już zaimportowanym obiekcie modułu.

Ponowne ładowanie modułów w Pythonie 3.0 do 3.3

W wersjach Pythona od 3.0 do 3.3 wbudowana funkcja reload() została usunięta. Zamiast tego musisz zaimportować go z modułu imp.

Python
import mymodule import imp # Modify 'mymodule.py' externally... imp.reload(mymodule) 

Wyjaśnienie:

ile tygodni w miesiącu
  • Pierwszy moduł mymodule jest importowany w zwykły sposób.
  • Moduł imp udostępnia funkcję reload() w tym zakresie wersji.
  • Po edycji mymodule.py imp.reload(mymodule) ponownie ładuje moduł ze zaktualizowanymi zmianami.

Uwaga: moduł imp jest przestarzały od wersji Python 3.4 i został zastąpiony przez importlib.

Ponowne ładowanie modułów w Pythonie 3.4 i nowszych

Począwszy od wersji Python 3.4 zalecanym sposobem ponownego załadowania modułu jest użycie importlib.reload().

Python
import mymodule import importlib # Modify 'mymodule.py' externally... importlib.reload(mymodule) 

Wyjaśnienie:

  • mymodule jest najpierw importowany normalnie.
  • Następnie importlib.reload(mymodule) ponownie ładuje zaktualizowany moduł.
  • To jest aktualny i oficjalny sposób przeładowywania modułów w Pythonie 3.4+.

Uwaga: Podczas testowania zmian modułów należy używać tej metody we wszystkich nowoczesnych skryptach i notatnikach języka Python.

Czy możesz rozładować moduł w Pythonie?

Obecnie Python nie zapewnia wbudowanego sposobu pełnego zwolnienia modułu po jego zaimportowaniu. Gdy moduł zostanie załadowany do pamięci, pozostaje on dostępny w sys.modules aż do zakończenia programu. Chociaż możesz usunąć moduł z sys.modules, nie gwarantuje to jego całkowitego usunięcia z pamięci lub zniknięcia jego odniesień:

Python
import mymodule import sys del sys.modules['mymodule'] 


Spowoduje to jedynie usunięcie modułu z pamięci podręcznej sys.modules. Jeśli jakakolwiek zmienna lub obiekt nadal odwołuje się do modułu, nie zostanie całkowicie wyładowany.

w celu

Dlaczego rozładunek nie jest obsługiwany?

  • Python zarządza modułami globalnie w pamięci.
  • Dynamiczne zwalnianie może prowadzić do niespójnego zachowania, jeśli części kodu nadal zawierają odniesienia do starego modułu.