eu tenho um foo.py
def foo():
print "test"
No IPython eu uso:
In [6]: import foo
In [7]: foo.foo()
test
Então mudei foo()
para:
def foo():
print "test changed"
No IPython, o resultado da invocação ainda é test
:
In [10]: import foo
In [11]: foo.foo()
test
Então eu uso:
In [15]: del foo
In [16]: import foo
In [17]: foo.foo()
test
Apago o foo.pyc
na mesma pasta foo.py
existe, mas ainda sem sorte.
Posso saber como reimportar o código atualizado em tempo de execução?
python
runtime
ipython
overloading
python-import
user478514
fonte
fonte
Respostas:
Para Python 2.x
Para Python 3.x
import importlib import foo #import the module here, so that it can be reloaded. importlib.reload(foo)
fonte
reload
um módulo ?. por exemplo. Você deveria estar fazendo deimport foo
antemãofrom foo import *
oufrom foo import bar
, o símbolofoo
não é definido. Você precisaimport sys
entãoreload(sys.modules['foo'])
ou talvezreload(sys.modules[bar.__module__])
Além da resposta do gnibbler:
Isso mudou no Python 3 para:
>>> import imp >>> imp.reload(foo)
Como @onnodb aponta,
imp
está obsoletoimportlib
desde o Python 3.4:>>> import importlib >>> importlib.reload(foo)
fonte
O recurso autoreload do IPython3 funciona perfeitamente.
Estou usando o exemplo real da página da web. Primeiro carregue o recurso 'autoreload'.
In []: %load_ext autoreload In []: %autoreload 2
Em seguida, importe o módulo que deseja testar:
In []: import foo In []: foo.some_function() Out[]: 42
Abra foo.py em um editor e altere some_function para retornar 43
In []: foo.some_function() Out[]: 43
Também funciona se você importar a função diretamente.
In []: from foo import some_function In []: some_function() Out[]: 42
Faça a alteração em some_function para retornar 43.
In []: some_function() Out[]: 43
fonte
Se você quiser que isso aconteça automaticamente, existe o módulo autoreload que vem com o iPython.
fonte