у меня есть foo.py
def foo():
print "test"
В IPython я использую:
In [6]: import foo
In [7]: foo.foo()
test
Затем я изменил на foo()
:
def foo():
print "test changed"
В IPython результат вызова по-прежнему test
:
In [10]: import foo
In [11]: foo.foo()
test
Тогда использую:
In [15]: del foo
In [16]: import foo
In [17]: foo.foo()
test
Я удаляю foo.pyc
в той же папке foo.py
существует, но все равно не повезло.
Могу ли я узнать, как повторно импортировать обновленный код во время выполнения?
python
runtime
ipython
overloading
python-import
user478514
источник
источник
Ответы:
Для Python 2.x
Для Python 3.x
import importlib import foo #import the module here, so that it can be reloaded. importlib.reload(foo)
источник
reload
модулю ?. например. Вы должны сделать этоimport foo
заранееfrom foo import *
илиfrom foo import bar
, символfoo
не будет определен. Вам нужноimport sys
тогдаreload(sys.modules['foo'])
или, возможно,reload(sys.modules[bar.__module__])
В дополнение к ответу gnibbler:
Это изменилось в Python 3 на:
>>> import imp >>> imp.reload(foo)
Как указывает @onnodb,
imp
устарел в пользуimportlib
Python 3.4:>>> import importlib >>> importlib.reload(foo)
источник
IPython3 в автоперезагрузки функция работает правильно.
Я использую реальный пример с веб-страницы. Сначала загрузите функцию автоматической перезагрузки.
In []: %load_ext autoreload In []: %autoreload 2
Затем импортируйте модуль, который хотите протестировать:
In []: import foo In []: foo.some_function() Out[]: 42
Откройте foo.py в редакторе и измените some_function, чтобы вернуть 43
In []: foo.some_function() Out[]: 43
Это также работает, если вы импортируете функцию напрямую.
In []: from foo import some_function In []: some_function() Out[]: 42
Внесите изменения в some_function, чтобы вернуть 43.
In []: some_function() Out[]: 43
источник
Если вы хотите , чтобы это произошло автоматически, есть автоперезагрузки модуль , который поставляется с IPython.
источник