logo

Поновно учитавање модула у Питхон-у

Дат нам је случај у којем желимо да ажурирамо и тестирамо Питхон модул без поновног покретања интерпретатора. Ово је посебно корисно током развоја када екстерно мењате датотеке модула и желите да се те промене одмах одразе. Питхон нам омогућава да поново учитамо претходно увезени модул помоћу функције релоад(). На пример ако сте уређивали помоћну датотеку утилс.пи док ваша скрипта ради, поновно учитавање вам омогућава да поново увезете ажурирани садржај без поновног покретања Питхон љуске.

Када треба поново учитати модул?

  • Током отклањања грешака или тестирања уживо
  • Када користите интерактивне тумаче као што су ИПитхон или Јупитер
  • Током развоја додатака или модуларних система
  • Да одражава промене направљене у спољним .пи датотекама без поновног покретања сесије

Поновно учитавање модула у Питхон 2.к

У Питхон 2.к можете директно користити уграђену функцију релоад() да поново учитате модул који је претходно увезен.

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

Објашњење:



  • мимодуле се прво увози коришћењем импорта.
  • Након што извршите спољне измене у мимодуле.пи позивом релоад(мимодуле) поново се учитава ажурирана верзија без поновног покретања интерпретатора.
  • Нема потребе за поновним увозом — релоад() ради на већ увезеном објекту модула.

Поновно учитавање модула у Питхон-у 3.0 до 3.3

У верзијама Питхон-а од 3.0 до 3.3 уграђена функција релоад() је уклоњена. Уместо тога, потребно је да га увезете из имп модула.

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

Објашњење:

  • Први мимодуле се увози као и обично.
  • Модул имп обезбеђује функцију релоад() током овог опсега верзија.
  • Након уређивања мимодуле.пи имп.релоад(мимодуле) поново учитава модул са ажурираним изменама.

Напомена: Модул имп је застарео од Питхон-а 3.4 и замењен је импортлиб-ом.

Поновно учитавање модула у Питхон-у 3.4 и новијим

Почевши од Питхон-а 3.4, препоручени начин за поновно учитавање модула је коришћење импортлиб.релоад().

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

Објашњење:

  • мимодуле се прво увози нормално.
  • Затим импортлиб.релоад(мимодуле) поново учитава ажурирани модул.
  • Ово је тренутни и званични начин за поновно учитавање модула у Питхон 3.4+.

Напомена: Користите овај метод у свим модерним Питхон скриптама и бележницама када тестирате промене модула.

Можете ли да скинете модул у Питхон-у?

Тренутно Питхон не пружа уграђени начин за потпуно истовар модула када се увезе. Једном када се модул учита у меморију остаје доступан у сис.модулес док се програм не заврши. Иако можете да избришете модул из сис.модулес, то не гарантује његово потпуно уклањање из меморије или да су његове референце нестале:

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


Ово ће само уклонити модул из кеша сис.модулес. Ако се било која променљива или објекат још увек позива на модул, неће бити у потпуности истоварен.

Зашто истовар није подржан?

  • Питхон глобално управља модулима у меморији.
  • Динамичко растерећење може довести до недоследног понашања ако делови вашег кода и даље садрже референце на стари модул.