Eu sei que isso pode ser feito, mas nunca me lembro como.
Como você pode reimportar um módulo em python? O cenário é o seguinte: Eu importo um módulo interativamente e mexo nele, mas então enfrento um erro. Corrijo o erro no arquivo .py e quero reimportar o módulo fixo sem sair do python. Como eu posso fazer isso ?
Respostas:
Isso deve funcionar:
Dos documentos do Python
Se você estiver executando o Python 3.4 ou superior,
import importlib
façaimportlib.reload(nameOfModule)
.Não se esqueça das advertências de usar este método:
Quando um módulo é recarregado, seu dicionário (contendo as variáveis globais do módulo) é mantido. As redefinições de nomes substituirão as definições antigas, portanto isso geralmente não é um problema, mas se a nova versão de um módulo não definir um nome definido pela versão antiga, a definição antiga não será removida.
Se um módulo importa objetos de outro módulo usando
from ... import ...
, chamarreload()
o outro módulo não redefine os objetos importados - uma maneira de contornar isso é reexecutar afrom
instrução, outra é usarimport
nomes qualificados (module.*name*
).Se um módulo instancia instâncias de uma classe, recarregar o módulo que define a classe não afeta as definições de método das instâncias - elas continuam usando a definição de classe antiga. O mesmo vale para classes derivadas.
fonte
from filename import *
. Como recarregar?import foo; from foo import bar; reload(foo)
No python 3,
reload
não é mais uma função integrada.Se você estiver usando o python 3.4+, você deve usar a
reload
partir daimportlib
biblioteca:Se você estiver usando python 3.2 ou 3.3, deverá:
em vez de. Consulte http://docs.python.org/3.0/library/imp.html#imp.reload
Se você estiver usando
ipython
, definitivamente considere usar aautoreload
extensão:fonte
imp.reload
é preterido desde Python 3.4, usarimportlib.reload
função vez.from mymodule import myfunc
, entãoimportlib.reload(myfunc)
,importlib.reload(mymodule.myfunc)
,importlib.reload(mymodule)
todos dão uma NameError.Na verdade, no Python 3, o módulo
imp
está marcado como DEPRECATED. Bem, pelo menos isso é verdade para o 3.4.Em vez disso, a
reload
função doimportlib
módulo deve ser usada:https://docs.python.org/3/library/importlib.html#importlib.reload
Mas esteja ciente de que esta biblioteca teve algumas alterações de API nas duas últimas versões secundárias.
fonte
Se você deseja importar uma função ou classe específica de um módulo, você pode fazer isso:
fonte
Embora as respostas fornecidas funcionem para um módulo específico, elas não recarregam os submódulos, conforme observado em Esta resposta :
No entanto, se estiver usando a
__all__
variável para definir a API pública, é possível recarregar automaticamente todos os módulos disponíveis ao público:As advertências observadas na resposta anterior ainda são válidas. Notavelmente, a modificação de um submódulo que não faz parte da API pública, conforme descrito pela
__all__
variável, não será afetada por um recarregamento usando esta função. Da mesma forma, a remoção de um elemento de um submódulo não será refletida por uma recarga.fonte