Ipython: повторный импорт модулей при использовании% run
Мне нравится ipython, но я обнаружил проблему с% run: импортированные модули не перезагружаются, когда вызов% run вызывается повторно.
Предположим, что файл ex1.py содержит строки:
import ex2
ex2.x.append(1)
print ex2.x
И файл ex2.py содержит:
x = []
Теперь, запуская python ex1.py из командной строки, каждый раз печатает [1] каждый раз. Но вызов %run ex1.py
изнутри ipython многократно печатает [1], [1,1], [1,1,1] и т.д. Это связано с тем, что модуль ex2.py не перезагружается. Таким образом, у нас есть проблема: протокол ipython run- script не отражает поведение "реального мира".
Примечание:
%load_ext autoreload
%autoreload 2
не помогает. Эти строки будут загружены ex2.py, только если было внесено изменение в файл ex2.py. Если мы не вносим никаких изменений или не вносим изменений в ex1.py, мы получаем нежелательное поведение.
Есть ли способ заставить% run вести себя как командная строка здесь? Это похоже на реальный недостаток использования ipython в качестве среды тестирования для скриптов. (Или, может быть, мораль заключается в том, что модуль не должен записываться в другое пространство имен модулей?)
Ответы
Ответ 1
%run ex1.py
(или любой script, если на то пошло) не выполняет глубокую перезагрузку импортированного модуля, даже если расширение автозагрузки добавлено в 2. Это "недостаток" в том, как команда %run
работает в ipython.
Вам нужно будет явно вызвать
dreload(ex2)
для глубокой перезагрузки перед повторным выполнением %run ex1.py
.
Смотрите - http://ipython.org/ipython-doc/dev/api/generated/IPython.lib.deepreload.html
В будущем могут быть сделаны планы сделать %run
сделать глубокую перезагрузку, и вы можете найти эту проблему, которая по-прежнему остается открытой проблемой в это время написания, предлагаемой пользователем здесь - https://github.com/ipython/ipython/issues/461
Ответ 2
Я сталкиваюсь с той же проблемой. Мне кажется, что это нежелательный эффект команды запуска ipython - он не перезагружает импортированные модули.
Автор прав: если в ex2.py были внесены изменения, следующая команда поможет перезагрузить
%load_ext autoreload
%autoreload 2
Самый простой способ обойти это изменить импортированные модули (в этом примере, ex2.py) каждый раз и выполнить следующие команды в ipython
%load_ext autoreload
%autoreload 2
%run ex1.py
Это помогает перезагрузить ex2.py.
Обратите внимание, что ex2.py необходимо модифицировать каждый раз, прежде чем выполнять 3 строки выше. Только таким образом модуль ex2 может быть перезагружен.