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

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


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
Роберт Новак

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.