logo

Презареждане на модули в Python

Даден ни е случай, в който искаме да актуализираме и тестваме Python модул, без да рестартираме интерпретатора. Това е особено полезно по време на разработката, когато модифицирате модулни файлове външно и искате тези промени да се отразят незабавно. Python ни позволява да презаредим предварително импортиран модул с помощта на функцията reload(). например ако сте редактирали помощен файл utils.py, докато вашият скрипт работи, презареждането ви позволява да импортирате отново актуализираното съдържание, без да рестартирате обвивката на Python.

Кога трябва да презаредите модул?

  • По време на отстраняване на грешки или тестване на живо
  • Когато използвате интерактивни интерпретатори като IPython или Jupyter
  • Докато разработвате плъгини или модулни системи
  • За отразяване на промените, направени във външни .py файлове, без рестартиране на сесията

Презареждане на модули в Python 2.x

В Python 2.x можете директно да използвате вградената функция reload(), за да презаредите модул, който е бил импортиран преди това.

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

Обяснение:



  • mymodule първо се импортира чрез import.
  • След извършване на външни промени в mymodule.py извикването на reload(mymodule) презарежда актуализираната версия без рестартиране на интерпретатора.
  • Няма нужда от повторно импортиране — reload() работи върху вече импортиран модулен обект.

Презареждане на модули в Python 3.0 до 3.3

Във версии на Python от 3.0 до 3.3 вградената функция reload() беше премахната. Вместо това трябва да го импортирате от модула imp.

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

Обяснение:

  • Първият mymodule се импортира както обикновено.
  • Модулът imp осигурява функцията reload() по време на този диапазон от версии.
  • След редактиране на mymodule.py imp.reload(mymodule) презарежда модула с актуализирани промени.

Забележка: Модулът imp е отхвърлен от Python 3.4 и е заменен от importlib.

Презареждане на модули в Python 3.4 и по-нова версия

Започвайки от Python 3.4, препоръчителният начин за презареждане на модул е ​​чрез importlib.reload().

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

Обяснение:

  • mymodule първо се импортира нормално.
  • След това importlib.reload(mymodule) презарежда актуализирания модул.
  • Това е текущият и официален начин за презареждане на модули в Python 3.4+.

Забележка: Използвайте този метод във всички съвременни скриптове и бележници на Python, когато тествате промени в модула.

Можете ли да разтоварите модул в Python?

Понастоящем Python не предоставя вграден начин за пълно разтоварване на модул, след като бъде импортиран. След като модулът бъде зареден в паметта, той остава достъпен в sys.modules, докато програмата приключи. Въпреки че можете да изтриете модул от sys.modules, това не гарантира пълното му премахване от паметта или че препратките към него са изчезнали:

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


Това само ще премахне модула от кеша на sys.modules. Ако някоя променлива или обект все още препраща към модула, той няма да бъде напълно разтоварен.

Защо разтоварването не се поддържа?

  • Python управлява модули глобално в паметта.
  • Динамичното разтоварване може да доведе до непоследователно поведение, ако части от вашия код все още съдържат препратки към стария модул.