Подтвердить что ты не робот

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 в качестве среды тестирования для скриптов. (Или, может быть, мораль заключается в том, что модуль не должен записываться в другое пространство имен модулей?)

4b9b3361

Ответ 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 может быть перезагружен.