В настоящее время я работаю над проектом на Python, который содержит подмодули и использует numpy / scipy. Ipython используется в качестве интерактивной консоли. К сожалению, я не очень доволен рабочим процессом, который я использую сейчас, я был бы признателен за некоторые советы.
В IPython фреймворк загружается простой import
командой. Однако часто бывает необходимо изменить код в одном из подмодулей фреймворка. На данный момент модель уже загружена, и я использую IPython для взаимодействия с ней.
Теперь фреймворк содержит много модулей, которые зависят друг от друга, то есть, когда фреймворк изначально загружен, основной модуль импортирует и конфигурирует субмодули. Изменения в коде выполняются только в том случае, если модуль перезагружается с помощью reload(main_mod.sub_mod)
. Это громоздко, так как мне нужно перезагрузить все измененные модули индивидуально, используя полный путь. Было бы очень удобно, если reload(main_module)
бы также перезагрузить все подмодули, но без перезагрузки numpy / scipy ..
However, it is often necessary to change code in one of the submodules of the framework.
почемуnecessary to change code
? СпасибоОтветы:
IPython поставляется с некоторой магией автоматической перезагрузки :
Он будет перезагружать все измененные модули каждый раз перед выполнением новой строки. То, как это работает, немного отличается от
dreload
. Применяются некоторые предостережения, напечатайте,%autoreload?
чтобы увидеть, что может пойти не так.Если вы хотите всегда включать эти настройки, измените файл конфигурации IPython
~/.ipython/profile_default/ipython_config.py
[1] и добавьте:Кредит @Kos через комментарий ниже.
[1] Если у вас нет файла
~/.ipython/profile_default/ipython_config.py
,ipython profile create
сначала вам нужно позвонить . Или файл может быть расположен в$IPYTHONDIR
.источник
c.InteractiveShellApp.extensions = ['autoreload']
иc.InteractiveShellApp.exec_lines = ['%autoreload 2']
по моему~/.ipython/profile_default/ipython_config.py
.В IPython 0.12 (и, возможно, ранее) вы можете использовать это:
По сути это то же самое, что и ответ от pv. , за исключением того, что расширение было переименовано и теперь загружается с использованием
%load_ext
.источник
По какой-то причине ни
%autoreload
, ни,dreload
похоже , не работает для ситуации, когда вы импортируете код из одного ноутбука в другой .reload
Работает только обычный Python :На основании [1] .
источник
%autoreload
метода. Есть открытый отчет об ошибке, чтобы добавить поддержку%autoreload
для этого. ,IPython предлагает
dreload()
рекурсивно перезагрузить все подмодули. Лично я предпочитаю использовать%run()
магическую команду (хотя она не выполняет глубокую перезагрузку, как указал Джон Сальватье в комментариях).источник
dreload
был заменен в недавнем IPython (например, IPython 6.0) на deepreload .Модуль с именем
importlib
разрешает доступ к внутренним объектам импорта. Особенно, это обеспечивает функциюimportlib.reload()
:В отличие от
%autoreload
,importlib.reload()
также сбросить глобальные переменные, установленные в модуле. В большинстве случаев это то, что вы хотите.importlib
доступно только с Python 3.1. Для более старой версии вы должны использовать модульimp
.источник
http://shawnleezx.github.io/blog/2015/08/03/some-notes-on-ipython-startup-script/
Чтобы не вводить эти магические функции снова и снова, их можно поместить в сценарий запуска ipython (назовите его суффиксом .py в .ipython / profile_default / startup. Все сценарии python в этой папке будут загружены в соответствии с лексическим порядком), что выглядит следующим образом:
источник
%run script.py
из IPython REPLКак насчет этого:
Это должно эффективно перезагрузить все дерево модулей и подмодулей, которые вы ему даете. Вы также можете поместить эту функцию в ваш .ipythonrc (я думаю), чтобы она загружалась каждый раз, когда вы запускаете интерпретатор.
источник
from ... import ...
илиimport ... as
. По крайней мере, это часто доставляет мне некоторые проблемы при интерактивной работе на терминале. Я перешел к использованию хранимых макросов в IPython, которые выполняют необходимые операции импорта и настройки, чтобы начать работать в предопределенном состоянии.from ... import ...
иimport ... as
пока вещь, которую вы импортировали, является модулем. Единственное, на что он не распространяется, это модули в пакете, которые не были загружены из его__init__.py
файла. Для пакетов вы можете проверить, является ли__path__
атрибут модуля каталогом. Если это так, просмотрите его и рекурсивно импортируйте все модули, которые вы могли найти. Я не писал эту часть, потому что автор не просил решения для пакетов.pkgutil
для получения всех субмодулей в пакете, даже если пакет не импортирует субмодули в верхний модуль. stackoverflow.com/a/1707786/1243926sys.modules:
Другой вариант:
Проверено на ipython и ipython3 v5.1.0 на Ubuntu 14.04.
источник
Моя стандартная практика для перезагрузки состоит в том, чтобы объединить оба метода после первого открытия
IPython
:Загрузка модулей перед выполнением этого приведет к тому, что они не будут перезагружены, даже с руководством
reload(module_name)
. Я все еще очень редко получаю необъяснимые проблемы с методами класса, не перезагружающими, что я еще не изучал.источник
Обратите внимание, что вышеупомянутое
autoreload
работает только в IntelliJ, если вы вручную сохраняете измененный файл (например, используя ctrl + s или cmd + s). Кажется, он не работает с автосохранением.источник
На Jupyter Notebooks об Анаконде, сделав это:
произвел сообщение:
Похоже, это лучше сделать:
Информация о версии:
источник
Любые подобъекты не будут перезагружены этим, я полагаю, что для этого нужно использовать глубокую загрузку IPython.
источник