logo

Modules opnieuw laden in Python

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.

Python
import 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.

Python
import 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().

Python
import 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:

Python
import 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.