logo

Recarregando módulos em Python

Temos um caso em que queremos atualizar e testar um módulo Python sem reiniciar o interpretador. Isso é especialmente útil durante o desenvolvimento quando você modifica arquivos de módulo externamente e deseja que essas alterações sejam refletidas imediatamente. Python nos permite recarregar um módulo importado anteriormente usando a função reload(). Por exemplo se você editou um arquivo utilitário utils.py enquanto seu script estava em execução, o recarregamento permite reimportar o conteúdo atualizado sem reiniciar o shell Python.

Quando você deve recarregar um módulo?

  • Durante a depuração ou teste ao vivo
  • Ao usar interpretadores interativos como IPython ou Jupyter
  • Ao desenvolver plugins ou sistemas modulares
  • Para refletir as alterações feitas em arquivos .py externos sem reiniciar a sessão

Recarregando Módulos em Python 2.x

No Python 2.x você pode usar diretamente a função reload() integrada para recarregar um módulo que foi importado anteriormente.

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

Explicação:



  • mymodule é importado primeiro usando import.
  • Depois de fazer alterações externas em mymodule.py, chamar reload(mymodule) recarrega a versão atualizada sem reiniciar o interpretador.
  • Não há necessidade de reimportar — reload() funciona em um objeto de módulo já importado.

Recarregando Módulos em Python 3.0 a 3.3

Nas versões 3.0 a 3.3 do Python, a função reload() integrada foi removida. Em vez disso, você precisa importá-lo do módulo imp.

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

Explicação:

  • Primeiro mymodule é importado normalmente.
  • O módulo imp fornece a função reload() durante este intervalo de versões.
  • Após a edição mymodule.py imp.reload(mymodule) recarrega o módulo com alterações atualizadas.

Nota: O módulo imp está obsoleto a partir do Python 3.4 e foi substituído por importlib.

Recarregando módulos em Python 3.4 e superior

A partir do Python 3.4, a maneira recomendada de recarregar um módulo é usando importlib.reload().

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

Explicação:

  • mymodule é primeiro importado normalmente.
  • Então importlib.reload(mymodule) recarrega o módulo atualizado.
  • Esta é a forma atual e oficial de recarregar módulos em Python 3.4+.

Observação: use esse método em todos os scripts e notebooks Python modernos ao testar alterações de módulo.

Você pode descarregar um módulo em Python?

Atualmente o Python não fornece uma maneira integrada de descarregar totalmente um módulo depois de importado. Depois que um módulo é carregado na memória, ele permanece disponível em sys.modules até o programa terminar. Embora você possa excluir um módulo de sys.modules, isso não garante sua remoção completa da memória ou que suas referências desapareceram:

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


Isso removerá apenas o módulo do cache sys.modules. Se alguma variável ou objeto ainda estiver referenciando o módulo, ele não será totalmente descarregado.

Por que o descarregamento não é compatível?

  • Python gerencia módulos globalmente na memória.
  • O descarregamento dinâmico pode levar a um comportamento inconsistente se partes do seu código ainda contiverem referências ao módulo antigo.