We krijgen een geval voorgelegd waarin we een Python-module willen updaten en testen zonder de tolk opnieuw te starten. Dit is vooral handig tijdens de ontwikkeling wanneer u modulebestanden extern wijzigt en wilt dat deze wijzigingen onmiddellijk worden doorgevoerd. Met Python kunnen we een eerder geïmporteerde module opnieuw laden met behulp van de functie reload(). Bijvoorbeeld als u een hulpprogrammabestand utils.py hebt bewerkt terwijl uw script actief is, kunt u door het opnieuw laden de bijgewerkte inhoud opnieuw importeren zonder de Python-shell opnieuw te starten.
Wanneer moet u een module opnieuw laden?
- Tijdens het debuggen of live testen
- Bij gebruik van interactieve tolken zoals IPython of Jupyter
- Tijdens het ontwikkelen van plug-ins of modulaire systemen
- Om wijzigingen weer te geven die zijn aangebracht in externe .py-bestanden zonder de sessie opnieuw te starten
Modules opnieuw laden in Python 2.x
In Python 2.x kun je direct de ingebouwde functie reload() gebruiken om een module die eerder is geïmporteerd opnieuw te laden.
Pythonimport mymodule # Modify 'mymodule.py' externally here... reload(mymodule)
Uitleg:
- mymodule wordt eerst geïmporteerd met import.
- Na het aanbrengen van externe wijzigingen in mymodule.py wordt door het aanroepen van reload(mymodule) de bijgewerkte versie opnieuw geladen zonder de tolk opnieuw te starten.
- Opnieuw importeren is niet nodig: reload() werkt op een reeds geïmporteerd moduleobject.
Modules opnieuw laden in Python 3.0 naar 3.3
In Python-versies 3.0 tot 3.3 is de ingebouwde functie reload() verwijderd. In plaats daarvan moet je het importeren vanuit de imp-module.
Pythonimport mymodule import imp # Modify 'mymodule.py' externally... imp.reload(mymodule)
Uitleg:
- Eerst wordt mijnmodule zoals gebruikelijk geïmporteerd.
- De imp-module biedt de functie reload() tijdens dit versiebereik.
- Na het bewerken van mymodule.py laadt imp.reload(mymodule) de module opnieuw met bijgewerkte wijzigingen.
Opmerking: de imp-module is verouderd vanaf Python 3.4 en wordt vervangen door importlib.
Modules opnieuw laden in Python 3.4 en hoger
Vanaf Python 3.4 is de aanbevolen manier om een module opnieuw te laden het gebruik van importlib.reload().
Pythonimport mymodule import importlib # Modify 'mymodule.py' externally... importlib.reload(mymodule)
Uitleg:
- mymodule wordt eerst normaal geïmporteerd.
- Vervolgens laadt importlib.reload(mymodule) de bijgewerkte module opnieuw.
- Dit is de huidige en officiële manier om modules in Python 3.4+ te herladen.
Opmerking: Gebruik deze methode in alle moderne Python-scripts en -notebooks bij het testen van modulewijzigingen.
Kun je een module in Python ontladen?
Momenteel biedt Python geen ingebouwde manier om een module volledig te ontladen nadat deze is geïmporteerd. Zodra een module in het geheugen is geladen, blijft deze beschikbaar in sys.modules totdat het programma eindigt. Hoewel u een module uit sys.modules kunt verwijderen, garandeert dit niet dat deze volledig uit het geheugen wordt verwijderd of dat de verwijzingen ervan verdwenen zijn:
Pythonimport mymodule import sys del sys.modules['mymodule']
Hierdoor wordt de module alleen uit de sys.modules-cache verwijderd. Als een variabele of object nog steeds naar de module verwijst, wordt deze niet volledig verwijderd.
Waarom wordt lossen niet ondersteund?
- Python beheert modules wereldwijd in het geheugen.
- Dynamisch lossen kan tot inconsistent gedrag leiden als delen van uw code nog steeds verwijzingen naar de oude module bevatten.