logo

Ricaricamento dei moduli in Python

Ci viene fornito un caso in cui vogliamo aggiornare e testare un modulo Python senza riavviare l'interprete. Ciò è particolarmente utile durante lo sviluppo quando si modificano i file del modulo esternamente e si desidera che tali modifiche si riflettano immediatamente. Python ci consente di ricaricare un modulo precedentemente importato utilizzando la funzione reload(). Per esempio se hai modificato un file di utilità utils.py mentre lo script è in esecuzione, il ricaricamento ti consente di reimportare il contenuto aggiornato senza riavviare la shell Python.

Quando dovresti ricaricare un modulo?

  • Durante il debug o il test in tempo reale
  • Quando si utilizzano interpreti interattivi come IPython o Jupyter
  • Durante lo sviluppo di plugin o sistemi modulari
  • Per riflettere le modifiche apportate ai file .py esterni senza riavviare la sessione

Ricaricamento dei moduli in Python 2.x

In Python 2.x puoi utilizzare direttamente la funzione reload() incorporata per ricaricare un modulo precedentemente importato.

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

Spiegazione:



  • mymodule viene prima importato utilizzando import.
  • Dopo aver apportato modifiche esterne a mymodule.py, la chiamata reload(mymodule) ricarica la versione aggiornata senza riavviare l'interprete.
  • Non è necessario reimportare: reload() funziona su un oggetto modulo già importato.

Ricaricamento dei moduli in Python da 3.0 a 3.3

Nelle versioni Python dalla 3.0 alla 3.3 la funzione reload() incorporata è stata rimossa. Invece devi importarlo dal modulo imp.

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

Spiegazione:

  • Innanzitutto mymodule viene importato come al solito.
  • Il modulo imp fornisce la funzione reload() durante questo intervallo di versioni.
  • Dopo aver modificato mymodule.py imp.reload(mymodule) ricarica il modulo con le modifiche aggiornate.

Nota: il modulo imp è deprecato a partire da Python 3.4 ed è sostituito da importlib.

Ricaricamento dei moduli in Python 3.4 e versioni successive

A partire da Python 3.4 il modo consigliato per ricaricare un modulo è utilizzare importlib.reload().

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

Spiegazione:

  • mymodule viene prima importato normalmente.
  • Quindi importlib.reload(mymodule) ricarica il modulo aggiornato.
  • Questo è il modo attuale e ufficiale per ricaricare i moduli in Python 3.4+.

Nota: utilizzare questo metodo in tutti gli script e i notebook Python moderni durante il test delle modifiche al modulo.

Puoi scaricare un modulo in Python?

Attualmente Python non fornisce un modo integrato per scaricare completamente un modulo una volta importato. Una volta caricato in memoria, un modulo rimane disponibile in sys.modules fino al termine del programma. Sebbene sia possibile eliminare un modulo da sys.modules ciò non garantisce la sua completa rimozione dalla memoria o che i suoi riferimenti siano scomparsi:

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


Ciò rimuoverà solo il modulo dalla cache sys.modules. Se qualche variabile o oggetto fa ancora riferimento al modulo, non verrà completamente scaricato.

Perché lo scaricamento non è supportato?

  • Python gestisce i moduli globalmente in memoria.
  • Lo scaricamento dinamico potrebbe portare a un comportamento incoerente se parti del codice contengono ancora riferimenti al vecchio modulo.