Dostaneme případ, kdy chceme aktualizovat a otestovat modul Pythonu bez restartování interpretu. To je užitečné zejména při vývoji, když externě upravujete soubory modulů a chcete, aby se tyto změny okamžitě projevily. Python nám umožňuje znovu načíst dříve importovaný modul pomocí funkce reload(). Například pokud jste upravili obslužný soubor utils.py, zatímco váš skript běží, opětovné načtení vám umožní znovu importovat aktualizovaný obsah bez restartování shellu Pythonu.
Kdy byste měli znovu načíst modul?
- Během ladění nebo živého testování
- Při použití interaktivních interpretů, jako je IPython nebo Jupyter
- Při vývoji pluginů nebo modulárních systémů
- Odrážet změny provedené v externích souborech .py bez restartování relace
Znovunačtení modulů v Pythonu 2.x
V Pythonu 2.x můžete přímo použít vestavěnou funkci reload() k opětovnému načtení modulu, který byl dříve importován.
Pythonimport mymodule # Modify 'mymodule.py' externally here... reload(mymodule)
Vysvětlení:
- mymodule se nejprve importuje pomocí importu.
- Po provedení externích změn v mymodule.py volání reload(mymodule) znovu načte aktualizovanou verzi bez restartování interpretu.
- Není třeba znovu importovat – funkce reload() funguje na již importovaném objektu modulu.
Znovunačtení modulů v Pythonu 3.0 až 3.3
Ve verzích Pythonu 3.0 až 3.3 byla vestavěná funkce reload() odstraněna. Místo toho jej musíte importovat z modulu imp.
Pythonimport mymodule import imp # Modify 'mymodule.py' externally... imp.reload(mymodule)
Vysvětlení:
- První mymodule je importován jako obvykle.
- Modul imp poskytuje v tomto rozsahu verzí funkci reload().
- Po úpravě mymodule.py imp.reload(mymodule) znovu načte modul s aktualizovanými změnami.
Poznámka: Modul imp je od Pythonu 3.4 zastaralý a je nahrazen importlib.
Znovunačtení modulů v Pythonu 3.4 a výše
Počínaje Pythonem 3.4 je doporučený způsob opětovného načtení modulu pomocí importlib.reload().
Pythonimport mymodule import importlib # Modify 'mymodule.py' externally... importlib.reload(mymodule)
Vysvětlení:
- mymodule se nejprve importuje normálně.
- Poté importlib.reload(mymodule) znovu načte aktualizovaný modul.
- Toto je aktuální a oficiální způsob, jak znovu načíst moduly v Pythonu 3.4+.
Poznámka: Tuto metodu použijte ve všech moderních skriptech a noteboocích Pythonu při testování změn modulů.
Můžete uvolnit modul v Pythonu?
V současné době Python neposkytuje vestavěný způsob, jak plně uvolnit modul po jeho importu. Jakmile je modul načten do paměti, zůstane dostupný v sys.modules, dokud program neskončí. Ačkoli můžete odstranit modul ze sys.modules, nezaručuje to jeho úplné odstranění z paměti nebo že jeho odkazy budou pryč:
Pythonimport mymodule import sys del sys.modules['mymodule']
Tím pouze odeberete modul z mezipaměti sys.modules. Pokud nějaká proměnná nebo objekt stále odkazuje na modul, nebude plně uvolněn.
Proč není vykládání podporováno?
- Python spravuje moduly globálně v paměti.
- Dynamické uvolňování může vést k nekonzistentnímu chování, pokud části vašeho kódu stále obsahují odkazy na starý modul.