logo

Ponovno nalaganje modulov v Python

Podan nam je primer, ko želimo posodobiti in preizkusiti modul Python brez ponovnega zagona tolmača. To je še posebej koristno med razvojem, ko zunanje spreminjate datoteke modulov in želite, da se te spremembe odražajo takoj. Python nam omogoča ponovno nalaganje predhodno uvoženega modula s funkcijo reload(). Na primer če ste uredili pomožno datoteko utils.py, medtem ko se vaš skript izvaja, vam ponovno nalaganje omogoča ponovni uvoz posodobljene vsebine brez ponovnega zagona lupine Python.

Kdaj morate znova naložiti modul?

  • Med odpravljanjem napak ali preskušanjem v živo
  • Pri uporabi interaktivnih tolmačev, kot sta IPython ali Jupyter
  • Pri razvoju vtičnikov ali modularnih sistemov
  • Za prikaz sprememb v zunanjih datotekah .py brez ponovnega zagona seje

Ponovno nalaganje modulov v Python 2.x

V Python 2.x lahko neposredno uporabite vgrajeno funkcijo reload() za ponovno nalaganje modula, ki je bil prej uvožen.

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

Pojasnilo:



  • mymodule se najprej uvozi z uvozom.
  • Po zunanjih spremembah v mymodule.py klic reload(mymodule) znova naloži posodobljeno različico brez ponovnega zagona tolmača.
  • Ni potrebe po ponovnem uvozu — reload() deluje na že uvoženem predmetu modula.

Ponovno nalaganje modulov v Python 3.0 do 3.3

V različicah Pythona od 3.0 do 3.3 je bila vgrajena funkcija reload() odstranjena. Namesto tega ga morate uvoziti iz modula imp.

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

Pojasnilo:

  • Prvi mymodule je uvožen kot običajno.
  • Modul imp zagotavlja funkcijo reload() v tem obsegu različic.
  • Po urejanju mymodule.py imp.reload(mymodule) znova naloži modul s posodobljenimi spremembami.

Opomba: Modul imp je od Pythona 3.4 opuščen in nadomeščen z importlib.

Ponovno nalaganje modulov v Python 3.4 in novejšem

Od Pythona 3.4 dalje je priporočen način za ponovno nalaganje modula z uporabo importlib.reload().

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

Pojasnilo:

  • mymodule se najprej običajno uvozi.
  • Nato importlib.reload(mymodule) znova naloži posodobljeni modul.
  • To je trenutni in uradni način za ponovno nalaganje modulov v Python 3.4+.

Opomba: to metodo uporabite v vseh sodobnih skriptih in zvezkih Python, ko preskušate spremembe modula.

Ali lahko razložite modul v Pythonu?

Trenutno Python ne ponuja vgrajenega načina za popolno raztovarjanje modula, ko je uvožen. Ko je modul naložen v pomnilnik, ostane na voljo v sys.modules, dokler se program ne konča. Čeprav lahko izbrišete modul iz sys.modules, to ne zagotavlja njegove popolne odstranitve iz pomnilnika ali da njegovih sklicev ni več:

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


java niz v int

S tem boste le odstranili modul iz predpomnilnika sys.modules. Če se katera koli spremenljivka ali predmet še vedno sklicuje na modul, ne bo v celoti razložen.

Zakaj raztovarjanje ni podprto?

  • Python globalno upravlja module v pomnilniku.
  • Dinamično razkladanje lahko povzroči neskladno vedenje, če deli vaše kode še vedno vsebujejo sklice na stari modul.