logo

Moduļu pārlādēšana Python

Mums ir sniegts gadījums, kad mēs vēlamies atjaunināt un pārbaudīt Python moduli, nerestartējot tulku. Tas ir īpaši noderīgi izstrādes laikā, kad modificējat moduļa failus ārēji un vēlaties, lai šīs izmaiņas tiktu atspoguļotas nekavējoties. Python ļauj atkārtoti ielādēt iepriekš importētu moduli, izmantojot funkciju reload (). Piemēram Ja esat rediģējis utilīta failu utils.py, kamēr notiek skripta atkārtota ielāde, varat atkārtoti importēt atjaunināto saturu, nerestartējot Python čaulu.

Kad vajadzētu atkārtoti ielādēt moduli?

  • Atkļūdošanas vai tiešsaistes testēšanas laikā
  • Izmantojot interaktīvos tulkus, piemēram, IPython vai Jupyter
  • Izstrādājot spraudņus vai moduļu sistēmas
  • Lai atspoguļotu ārējos .py failos veiktās izmaiņas, nerestartējot sesiju

Moduļu pārlādēšana programmā Python 2.x

Programmā Python 2.x varat tieši izmantot iebūvēto reload() funkciju, lai atkārtoti ielādētu iepriekš importētu moduli.

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

Paskaidrojums:



  • mymodule vispirms tiek importēts, izmantojot importēšanu.
  • Pēc ārēju izmaiņu veikšanas failā mymodule.py, izsaucot reload(mymodule), atjauninātā versija tiek atkārtoti ielādēta, nerestartējot tulku.
  • Nav nepieciešams atkārtoti importēt — reload() darbojas jau importētā moduļa objektā.

Moduļu pārlādēšana programmā Python 3.0 uz 3.3

Python versijās no 3.0 līdz 3.3 tika noņemta iebūvētā reload() funkcija. Tā vietā jums tas ir jāimportē no imp moduļa.

int uz virkni java
Python
import mymodule import imp # Modify 'mymodule.py' externally... imp.reload(mymodule) 

Paskaidrojums:

  • Vispirms mans modulis tiek importēts kā parasti.
  • imp modulis nodrošina reload() funkciju šajā versiju diapazonā.
  • Pēc rediģēšanas mymodule.py imp.reload(mymodule) atkārtoti ielādē moduli ar atjauninātām izmaiņām.

Piezīme: imp modulis ir novecojis no Python 3.4 un tiek aizstāts ar importlib.

Moduļu pārlādēšana Python 3.4 un jaunākās versijās

Sākot no Python 3.4, ieteicamais veids, kā atkārtoti ielādēt moduli, ir izmantot importlib.reload().

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

Paskaidrojums:

  • mymodule vispirms tiek importēts normāli.
  • Pēc tam importlib.reload(mymodule) atkārtoti ielādē atjaunināto moduli.
  • Šis ir pašreizējais un oficiālais veids, kā atkārtoti ielādēt moduļus Python 3.4+.

Piezīme. Izmantojiet šo metodi visos mūsdienu Python skriptos un piezīmjdatoros, testējot moduļu izmaiņas.

Vai Python var izlādēt moduli?

Pašlaik Python nenodrošina iebūvētu veidu, kā pilnībā izlādēt moduli, kad tas ir importēts. Kad modulis ir ielādēts atmiņā, tas paliek pieejams sys.modules līdz programmas beigām. Lai gan jūs varat izdzēst moduli no sys.modules, tas negarantē tā pilnīgu izņemšanu no atmiņas vai atsauces uz to:

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


Tādējādi modulis tiks noņemts tikai no sys.modules kešatmiņas. Ja kāds mainīgais vai objekts joprojām atsaucas uz moduli, tas netiks pilnībā izlādēts.

Kāpēc izkraušana netiek atbalstīta?

  • Python pārvalda moduļus globāli atmiņā.
  • Dinamiska izkraušana var izraisīt nekonsekventu darbību, ja koda daļās joprojām ir atsauces uz veco moduli.