Dostali sme prípad, keď chceme aktualizovať a otestovať modul Pythonu bez reštartovania interpreta. Toto je obzvlášť užitočné počas vývoja, keď externe upravujete súbory modulov a chcete, aby sa tieto zmeny prejavili okamžite. Python nám umožňuje znovu načítať predtým importovaný modul pomocou funkcie reload(). Napríklad ak ste upravili pomocný súbor utils.py počas spustenia skriptu, opätovné načítanie vám umožní znova importovať aktualizovaný obsah bez reštartovania shellu Pythonu.
reťazec na int
Kedy by ste mali znova načítať modul?
- Počas ladenia alebo testovania naživo
- Pri používaní interaktívnych tlmočníkov ako IPython alebo Jupyter
- Pri vývoji pluginov alebo modulárnych systémov
- Na zobrazenie zmien vykonaných v externých súboroch .py bez reštartovania relácie
Opätovné načítanie modulov v Pythone 2.x
V Pythone 2.x môžete priamo použiť vstavanú funkciu reload() na opätovné načítanie modulu, ktorý bol predtým importovaný.
Pythonimport mymodule # Modify 'mymodule.py' externally here... reload(mymodule)
Vysvetlenie:
- mymodule sa najprv importuje pomocou importu.
- Po vykonaní externých zmien v mymodule.py sa volaním reload(mymodule) znova načíta aktualizovaná verzia bez reštartovania tlmočníka.
- Nie je potrebné znova importovať – funkcia reload() funguje na už importovanom objekte modulu.
Opätovné načítanie modulov v Pythone 3.0 až 3.3
Vo verziách Pythonu 3.0 až 3.3 bola vstavaná funkcia reload() odstránená. Namiesto toho ho musíte importovať z modulu imp.
Pythonimport mymodule import imp # Modify 'mymodule.py' externally... imp.reload(mymodule)
Vysvetlenie:
- Prvý mymodul sa importuje ako zvyčajne.
- Modul imp poskytuje funkciu reload() počas tohto rozsahu verzií.
- Po úprave mymodule.py imp.reload(mymodule) znova načíta modul s aktualizovanými zmenami.
Poznámka: Modul imp je od Pythonu 3.4 zastaraný a je nahradený importlib.
Opätovné načítanie modulov v Pythone 3.4 a vyššie
Od Pythonu 3.4 je odporúčaný spôsob opätovného načítania modulu pomocou importlib.reload().
Pythonimport mymodule import importlib # Modify 'mymodule.py' externally... importlib.reload(mymodule)
Vysvetlenie:
- mymodule sa najskôr importuje normálne.
- Potom importlib.reload(mymodule) znova načíta aktualizovaný modul.
- Toto je aktuálny a oficiálny spôsob opätovného načítania modulov v Pythone 3.4+.
Poznámka: Túto metódu použite vo všetkých moderných skriptoch Pythonu a notebookoch pri testovaní zmien modulov.
Môžete uvoľniť modul v Pythone?
V súčasnosti Python neposkytuje vstavaný spôsob, ako úplne uvoľniť modul po jeho importovaní. Po načítaní modulu do pamäte zostane dostupný v sys.modules, kým sa program neskončí. Aj keď môžete odstrániť modul zo sys.modules, nezaručuje to jeho úplné odstránenie z pamäte alebo že jeho odkazy sú preč:
Pythonimport mymodule import sys del sys.modules['mymodule']
Toto odstráni iba modul z vyrovnávacej pamäte sys.modules. Ak nejaká premenná alebo objekt stále odkazuje na modul, nebude úplne uvoľnený.
porovnanie java
Prečo nie je podporované vykladanie?
- Python spravuje moduly globálne v pamäti.
- Dynamické vykladanie by mohlo viesť k nekonzistentnému správaniu, ak časti vášho kódu stále obsahujú odkazy na starý modul.