2009-12-15 3 views
104

Есть ли способ, чтобы IPython автоматически перезагружал все измененные коды? Либо до того, как каждая строка будет выполнена в оболочке, либо не будет выполнена, когда она будет запрошена. Я занимаюсь большим количеством поисковых программ с использованием IPython и SciPy, и мне очень больно вручную перезагружать каждый модуль, когда я его меняю.Автозагрузка модулей в IPython

+0

Здесь он реализован как расширение HTTP: //projects.scipy.org/ipython/ipython/ticket/154 –

+0

Возможно, вы захотите изменить принятый ответ. – Peque

+0

Я думаю, что обычно справедливо принять первый ответ, который отвечает на вопрос, кажется, что это немного значит изменить его спустя годы! –

ответ

53

ПЕРЕСМОТРЕННОГО - см Andrew_1510-х answer ниже, так как IPython была обновлена.

...

Это было немного трудно понять, как попасть из пыльного сообщение об ошибке, но:

Он поставляется с IPython сейчас!

import ipy_autoreload 
%autoreload 2 
%aimport your_mod 

# %autoreload? for help 

... то каждый раз, когда вы звоните your_mod.dwim(), он будет забрать последнюю версию.

+4

Что делать, если он менее прямой? '% run sometest.py' содержит' import themod'. После редактирования 'themod.py', я хотел бы просто'% запустить sometest.py', но он не подбирает изменения. – Jed

+2

Я думаю, что ipython 0.11 покончил с этой функцией. Или это просто переименовано/скрыто где-то? – SirVer

+0

СэрВер, ты прав. Вздох. Очевидно, что это в пакете «карантин»: http://www.archlinux.org/packages/community/any/ipython/files/ –

165

Для IPython версии 3.1, 4.x, 5.x и

In [1]: %load_ext autoreload 

    In [2]: %autoreload 2 

Тогда будет ваш модуль автоматически перезагружается по умолчанию. Это документ:

File:  ...my/python/path/lib/python2.7/site-packages/IPython/extensions/autoreload.py 

Docstring: 
``autoreload`` is an IPython extension that reloads modules 
automatically before executing the line of code typed. 

This makes for example the following workflow possible: 

.. sourcecode:: ipython 

    In [1]: %load_ext autoreload 

    In [2]: %autoreload 2 

    In [3]: from foo import some_function 

    In [4]: some_function() 
    Out[4]: 42 

    In [5]: # open foo.py in an editor and change some_function to return 43 

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

The module was reloaded without reloading it explicitly, and the 
object imported with ``from foo import ...`` was also updated. 

Существует трюк: когда вы забыть все из выше при использовании ipython, просто попробуйте:

import autoreload 
?autoreload 
# Then you get all the above 
65

Как уже упоминалось выше, необходимо расширение autoreload. Если вы хотите, чтобы он автоматически запускается каждый раз, когда вы запускаете ipython, вам нужно добавить его в файл ipython_config.py запуска:

Это может быть необходимо, чтобы произвести один первый:

ipython profile create 

Затем включите эти строки в ~/.ipython/profile_default/ipython_config.py :

c.InteractiveShellApp.exec_lines = [] 
c.InteractiveShellApp.exec_lines.append('%load_ext autoreload') 
c.InteractiveShellApp.exec_lines.append('%autoreload 2') 

Как дополнительное предупреждение в случае, если вам необходимо, чтобы воспользоваться скомпилированного кода Python в .pyc файлов:

c.InteractiveShellApp.exec_lines.append('print "Warning: disable autoreload in ipython_config.py to improve performance." ') 

редактировать: вышеуказанные работы с версии 0.12.1 и 0.13

+1

Это на самом деле здорово. Мне было интересно, почему никто другой не размещал решения для ее сохранения. Это также работает со старыми версиями IPython? Я использовал 0.12+. Я помню, что способ сохранения настроек ipython значительно изменился. –

+0

Я использую 0.12.1, и еще не пробовал 0.13, поэтому я не знаю, будет ли он работать с 0.13+ –

+5

Это хороший подход, но я думаю, что все, что вам нужно сделать, это заполнить extenstions который должен быть вокруг строки 27: 'c.InteractiveShellApp.extensions = ['autoreload']' – dvreed77

2

Вы можете использовать:

import ipy_autoreload 
    %autoreload 2 
    %aimport your_mod 
8

если добавить ipython_config.py в ~/.ipython/profile_default реж с линиями как ниже, а затем функциональные автоперезагрузки будут загружены на IPython запуске (проверено на 2.0.0):

print "--------->>>>>>>> ENABLE AUTORELOAD <<<<<<<<<------------" 

c = get_config() 
c.InteractiveShellApp.exec_lines = [] 
c.InteractiveShellApp.exec_lines.append('%load_ext autoreload') 
c.InteractiveShellApp.exec_lines.append('%autoreload 2') 
Смежные вопросы