2009-12-15 13 views
104

Czy istnieje sposób na automatyczne ponowne załadowanie IPython wszystkich zmienionych kodów? Albo przed wykonaniem każdej linii w powłoce, albo w przypadku jej braku, gdy jest to wymagane. Zajmuję się programowaniem eksploracyjnym przy użyciu IPythona i SciPy, a ręczne ładowanie każdego modułu za każdym razem, gdy go zmieniam, jest bardzo trudne.Automatyczne ładowanie modułów w IPython

+0

Tutaj jest zaimplementowana jako rozszerzenie http: //projects.scipy.org/ipython/ipython/ticket/154 –

+0

Możesz rozważyć zmianę akceptowanej odpowiedzi. – Peque

+0

Wydaje mi się, że zwykle jest godziwa akceptacja pierwszej odpowiedzi, która odpowiada na pytanie, wydaje się nieco sensowna zmiana lat później! –

Odpowiedz

53

zrewidowane - proszę zobaczyć Andrew_1510 na answer poniżej, jak ipython został zaktualizowany.

...

To było trochę trudno zorientować się, jak się tam dostać z zakurzonym raportu o błędzie, ale:

It statki z ipython teraz!

import ipy_autoreload 
%autoreload 2 
%aimport your_mod 

# %autoreload? for help 

... wtedy za każdym razem wywołać your_mod.dwim(), to będzie podnieść najnowszą wersję.

+4

Co, jeśli jest mniej bezpośredni? '% run sometest.py' zawiera' importować plik '. Po edycji 'themod.py', chciałbym po prostu'% uruchomić sometest.py', ale nie odbiera on zmian. – Jed

+2

Myślę, że ipython 0.11 wyłączył tę funkcję. Czy jest to po prostu przemianowane/ukryte gdzieś? – SirVer

+0

SirVer, masz rację. Westchnienie. Najwyraźniej jest to pakiet "kwarantanny": http://www.archlinux.org/packages/community/any/ipython/files/ –

165

Dla ipython wersji 3.1, 4.x, 5.x

In [1]: %load_ext autoreload 

    In [2]: %autoreload 2 

Wtedy twój moduł zostanie auto-reloaded domyślnie. To jest doc:

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. 

Jest trick: kiedy zapomnieć cały z powyższym podczas korzystania ipython, po prostu spróbuj:

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

Jak wspomniano powyżej, trzeba rozszerzenie autoreload. Jeśli chcesz, aby automatycznie uruchomić każdym uruchomieniu ipython, trzeba dodać ją do pliku ipython_config.py startowego:

może być konieczne, aby wygenerować jeden pierwszy:

ipython profile create 

Następnie zawierać te linie w ~/.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') 

jak również opcjonalnie ostrzeżenie w przypadku potrzeby skorzystania z skompilowanego kodu Pythona w .pyc plików:

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

edit: Powyższe działa z wersją 0.12.1 i 0.13

+1

To jest naprawdę świetne. Zastanawiałem się, dlaczego nikt inny nie zamieszczał rozwiązań, by go zachować. Czy działa to również ze starszymi wersjami IPython? Używam 0.12+. Przypominam, że sposób, w jaki ipython przechowuje modyfikacje, znacznie się zmienił. –

+0

Używam 0.12.1, a jeszcze nie próbowałem 0.13, więc nie wiem, czy będzie działać z 0.13+ –

+5

To jest dobre podejście, ale myślę, że wszystko, co musisz zrobić, to wypełnić extenstions która powinna być w pobliżu linii 27: 'c.InteractiveShellApp.extensions = ['autoreload']' – dvreed77

2

Można użyć:

import ipy_autoreload 
    %autoreload 2 
    %aimport your_mod 
8

jeśli dodać ipython_config.py do ~/.ipython/profile_default reż Z liniami takimi jak poniżej funkcja automatycznego ładowania zostanie załadowana podczas uruchamiania aplikacji ipython (testowane w wersji 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') 
Powiązane problemy