как «реимпортировать» модуль в python, после чего код будет изменен после импорта - PullRequest
68 голосов
/ 06 ноября 2010

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

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

Ответы [ 4 ]

88 голосов
/ 06 ноября 2010

Для 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)
61 голосов
/ 06 ноября 2010

В дополнение к ответу Гнибблера:

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

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

Как указывает @onnodb, imp устарела в пользу importlib, начиная с Python 3.4:

>>> import importlib
>>> importlib.reload(foo)
41 голосов
/ 07 июля 2017

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
4 голосов
/ 23 октября 2016

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

...