как «повторно импортировать» модуль в Python, а затем изменить код после импорта

88

у меня есть 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существует, но все равно не повезло.

Могу ли я узнать, как повторно импортировать обновленный код во время выполнения?

user478514
источник
2
Возможный дубликат повторного импорта модуля в python в интерактивном режиме
Правин

Ответы:

117

Для Python 2.x

reload(foo)

Для Python 3.x

import importlib
import foo #import the module here, so that it can be reloaded.
importlib.reload(foo)
Джон Ла Рой
источник
23
Фактически, просто «перезагрузите (foo)» - не нужно его повторно атрибутировать
jsbueno
2
Я не мог заставить его работать. Я получаю TypeError: аргумент reload () должен быть модулем
Бурак
2
@Burak, это аргумент, который вы передаете reloadмодулю ?. например. Вы должны сделать это import fooзаранее
Джон Ла Рой
27
Обратите внимание: если вы сделали from foo import *или from foo import bar, символ fooне будет определен. Вам нужно import sysтогда reload(sys.modules['foo'])или, возможно,reload(sys.modules[bar.__module__])
drevicko
3
Пожалуйста, позвольте Python 2.x умереть asp и прекратить поддержку Python 2.x! Обратный отсчет до вывода на пенсию python 2.x pythonclock.org .
Мартин ван Везель
65

В дополнение к ответу gnibbler:

Это изменилось в Python 3 на:

>>> import imp
>>> imp.reload(foo)

Как указывает @onnodb, impустарел в пользу importlibPython 3.4:

>>> import importlib
>>> importlib.reload(foo)
данлей
источник
5
Небольшое замечание: в более поздних версиях Python 3.x «imp» устарел в пользу «importlib». Хотя работает точно так же.
onnodb
54

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
Ашфак
источник
1
from foo import some_function, не работает под Jupyterlab Python 3.7.3
Роберт Новак
7

Если вы хотите , чтобы это произошло автоматически, есть автоперезагрузки модуль , который поставляется с IPython.

CpILL
источник
from foo import some_function, не работает под Jupyterlab Python 3.7.3
Роберт Новак