Dobili smo slučaj u kojem želimo ažurirati i testirati Python modul bez ponovnog pokretanja tumača. Ovo je posebno korisno tijekom razvoja kada eksterno mijenjate datoteke modula i želite da se te promjene odmah odraze. Python nam omogućuje ponovno učitavanje prethodno uvezenog modula pomoću funkcije reload(). Na primjer ako ste uredili pomoćnu datoteku utils.py dok se vaša skripta izvodi, ponovno učitavanje vam omogućuje ponovni uvoz ažuriranog sadržaja bez ponovnog pokretanja Python ljuske.
Kada biste trebali ponovno učitati modul?
- Tijekom otklanjanja pogrešaka ili testiranja uživo
- Kada koristite interaktivne tumače kao što su IPython ili Jupyter
- Tijekom razvoja dodataka ili modularnih sustava
- Za odražavanje promjena napravljenih u vanjskim .py datotekama bez ponovnog pokretanja sesije
Ponovno učitavanje modula u Python 2.x
U Python 2.x možete izravno koristiti ugrađenu funkciju reload() za ponovno učitavanje modula koji je prethodno uvezen.
Pythonimport mymodule # Modify 'mymodule.py' externally here... reload(mymodule)
Obrazloženje:
- mymodule se prvo uvozi pomoću importa.
- Nakon vanjskih promjena u mymodule.py pozivanje reload(mymodule) ponovno učitava ažuriranu verziju bez ponovnog pokretanja tumača.
- Nema potrebe za ponovnim uvozom — reload() radi na već uvezenom objektu modula.
Ponovno učitavanje modula u Python 3.0 do 3.3
U verzijama Pythona od 3.0 do 3.3 uklonjena je ugrađena funkcija reload(). Umjesto toga morate ga uvesti iz imp modula.
Pythonimport mymodule import imp # Modify 'mymodule.py' externally... imp.reload(mymodule)
Obrazloženje:
- Prvi mymodule se uvozi kao i obično.
- Modul imp pruža funkciju reload() tijekom ovog raspona verzija.
- Nakon uređivanja mymodule.py imp.reload(mymodule) ponovno učitava modul s ažuriranim promjenama.
Napomena: Modul imp je zastario od Pythona 3.4 i zamijenjen je importlibom.
Ponovno učitavanje modula u Python 3.4 i novijim
Počevši od Pythona 3.4, preporučeni način za ponovno učitavanje modula je pomoću importlib.reload().
Pythonimport mymodule import importlib # Modify 'mymodule.py' externally... importlib.reload(mymodule)
Obrazloženje:
- mymodule se prvo normalno uvozi.
- Zatim importlib.reload(mymodule) ponovno učitava ažurirani modul.
- Ovo je trenutačni i službeni način za ponovno učitavanje modula u Python 3.4+.
Napomena: Koristite ovu metodu u svim modernim Python skriptama i bilježnicama kada testirate promjene modula.
Možete li ukloniti modul u Pythonu?
Trenutno Python ne nudi ugrađeni način za potpuno uklanjanje modula nakon što se uveze. Jednom kada se modul učita u memoriju, ostaje dostupan u sys.modules dok program ne završi. Iako možete izbrisati modul iz sys.modules, to ne jamči njegovo potpuno uklanjanje iz memorije ili da su njegove reference nestale:
Pythonimport mymodule import sys del sys.modules['mymodule']
Ovo će samo ukloniti modul iz predmemorije sys.modules. Ako se bilo koja varijabla ili objekt još uvijek poziva na modul, neće biti potpuno ispražnjen.
Zašto istovar nije podržan?
- Python globalno upravlja modulima u memoriji.
- Dinamičko uklanjanje može dovesti do nekonzistentnog ponašanja ako dijelovi vašeg koda još uvijek sadrže reference na stari modul.