Vi får et tilfelle der vi ønsker å oppdatere og teste en Python-modul uten å starte tolken på nytt. Dette er spesielt nyttig under utvikling når du endrer modulfiler eksternt og vil at disse endringene skal gjenspeiles umiddelbart. Python lar oss laste en tidligere importert modul på nytt ved å bruke reload()-funksjonen. For eksempel Hvis du har redigert en verktøyfil, kan utils.py mens skriptet kjører gjeninnlasting lar deg importere det oppdaterte innholdet på nytt uten å starte Python-skallet på nytt.
Når bør du laste en modul på nytt?
- Under feilsøking eller live testing
- Når du bruker interaktive tolker som IPython eller Jupyter
- Mens du utvikler plugins eller modulære systemer
- Å gjenspeile endringer gjort i eksterne .py-filer uten å starte økten på nytt
Laste inn moduler på nytt i Python 2.x
I Python 2.x kan du direkte bruke den innebygde reload()-funksjonen for å laste en modul som tidligere ble importert på nytt.
Pythonimport mymodule # Modify 'mymodule.py' externally here... reload(mymodule)
Forklaring:
- mymodule importeres først ved hjelp av import.
- Etter å ha gjort eksterne endringer i mymodule.py ringer reload(mymodule) den oppdaterte versjonen på nytt uten å starte tolken på nytt.
- Du trenger ikke å importere på nytt - reload() fungerer på et allerede importert modulobjekt.
Laste inn moduler på nytt i Python 3.0 til 3.3
I Python versjoner 3.0 til 3.3 ble den innebygde reload()-funksjonen fjernet. I stedet må du importere den fra imp-modulen.
Pythonimport mymodule import imp # Modify 'mymodule.py' externally... imp.reload(mymodule)
Forklaring:
- Først importeres mymodule som vanlig.
- Imp-modulen gir reload()-funksjonen i dette versjonsområdet.
- Etter redigering av mymodule.py laster imp.reload(mymodule) inn modulen på nytt med oppdaterte endringer.
Merk: Imp-modulen er utdatert fra og med Python 3.4 og erstattes av importlib.
Laste inn moduler på nytt i Python 3.4 og nyere
Fra Python 3.4 er den anbefalte måten å laste en modul på nytt ved å bruke importlib.reload().
Pythonimport mymodule import importlib # Modify 'mymodule.py' externally... importlib.reload(mymodule)
Forklaring:
- mymodule importeres først normalt.
- Deretter laster importlib.reload(mymodule) den oppdaterte modulen på nytt.
- Dette er den nåværende og offisielle måten å laste moduler på nytt i Python 3.4+.
Merk: Bruk denne metoden i alle moderne Python-skript og notatbøker når du tester modulendringer.
Kan du laste ut en modul i Python?
Python tilbyr foreløpig ikke en innebygd måte å fullstendig losse en modul når den er importert. Når en modul er lastet inn i minnet, forblir den tilgjengelig i sys.modules til programmet avsluttes. Selv om du kan slette en modul fra sys.modules, garanterer dette ikke at den blir fullstendig fjernet fra minnet eller at referansene er borte:
Pythonimport mymodule import sys del sys.modules['mymodule']
Dette vil bare fjerne modulen fra sys.modules-bufferen. Hvis en variabel eller et objekt fortsatt refererer til modulen, vil den ikke bli fullstendig utlastet.
Hvorfor støttes ikke avlasting?
- Python administrerer moduler globalt i minnet.
- Dynamisk lossing kan føre til inkonsekvent oppførsel hvis deler av koden din fortsatt har referanser til den gamle modulen.