як “повторно імпортувати” модуль до 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, але все одно не везе.

Чи можу я знати, як повторно імпортувати оновлений код під час виконання?


Відповіді:


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заздалегідь
John La Rooy

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 загине як слід і припиніть підтримку Python 2.x! Зворотний відлік для виходу з експлуатації python 2.x pythonclock.org .
Martijn van Wezel,

65

На додаток до відповіді гніблера:

Це змінилося в Python 3 на:

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

Як зазначає @onnodb, impце застаріло на користь, importlibоскільки Python 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_, щоб повернути 43

In []: foo.some_function()
Out[]: 43

Це також працює, якщо ви імпортуєте функцію безпосередньо.

In []: from foo import some_function
In []: some_function()
Out[]: 42

Внесіть зміни в функцію some_ для повернення 43.

In []: some_function()
Out[]: 43

1
from foo import some_function, not working working under Jupyterlab Python 3.7.3
Robert Nowak

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.