logo

Laddar om moduler i Python

Vi får ett fall där vi vill uppdatera och testa en Python-modul utan att starta om tolken. Detta är särskilt användbart under utveckling när du modifierar modulfiler externt och vill att dessa ändringar ska återspeglas omedelbart. Python låter oss ladda om en tidigare importerad modul med hjälp av reload()-funktionen. Till exempel Om du har redigerat en verktygsfil medan ditt skript körs, kan du återimportera det uppdaterade innehållet utan att starta om Python-skalet.

När ska du ladda om en modul?

  • Under felsökning eller livetestning
  • När du använder interaktiva tolkar som IPython eller Jupyter
  • Medan du utvecklar plugins eller modulära system
  • För att återspegla ändringar som gjorts i externa .py-filer utan att starta om sessionen

Ladda om moduler i Python 2.x

I Python 2.x kan du direkt använda den inbyggda reload()-funktionen för att ladda om en modul som tidigare importerats.

Python
import mymodule # Modify 'mymodule.py' externally here... reload(mymodule) 

Förklaring:



  • mymodule importeras först med import.
  • Efter att ha gjort externa ändringar i mymodule.py anropa reload(mymodule) laddar om den uppdaterade versionen utan att starta om tolken.
  • Inget behov av att återimportera — reload() fungerar på ett redan importerat modulobjekt.

Ladda om moduler i Python 3.0 till 3.3

I Python-versionerna 3.0 till 3.3 togs den inbyggda reload()-funktionen bort. Istället måste du importera den från imp-modulen.

Python
import mymodule import imp # Modify 'mymodule.py' externally... imp.reload(mymodule) 

Förklaring:

  • Först importeras mymodule som vanligt.
  • Imp-modulen tillhandahåller reload()-funktionen under detta versionsintervall.
  • Efter redigering av mymodule.py laddar imp.reload(mymodule) om modulen med uppdaterade ändringar.

Obs: Imp-modulen är utfasad från och med Python 3.4 och ersätts av importlib.

Ladda om moduler i Python 3.4 och senare

Med utgångspunkt från Python 3.4 är det rekommenderade sättet att ladda om en modul genom att använda importlib.reload().

Python
import mymodule import importlib # Modify 'mymodule.py' externally... importlib.reload(mymodule) 

Förklaring:

  • mymodule importeras först normalt.
  • Importlib.reload(mymodule) laddar sedan om den uppdaterade modulen.
  • Detta är det nuvarande och officiella sättet att ladda om moduler i Python 3.4+.

Obs: Använd den här metoden i alla moderna Python-skript och anteckningsböcker när du testar moduländringar.

Kan du ladda ner en modul i Python?

För närvarande tillhandahåller Python inte ett inbyggt sätt att helt ladda ur en modul när den väl har importerats. När en modul väl har laddats in i minnet förblir den tillgänglig i sys.modules tills programmet avslutas. Även om du kan ta bort en modul från sys.modules garanterar det inte att den tas bort fullständigt från minnet eller att dess referenser är borta:

Python
import mymodule import sys del sys.modules['mymodule'] 


Detta tar bara bort modulen från sys.modules-cachen. Om någon variabel eller objekt fortfarande refererar till modulen kommer den inte att laddas ur helt.

Varför stöds inte avlastning?

  • Python hanterar moduler globalt i minnet.
  • Att ladda ur dynamiskt kan leda till inkonsekvent beteende om delar av din kod fortfarande innehåller referenser till den gamla modulen.