Przeładowywanie modułów podrzędnych w IPython

Obecnie pracuję nad projektem Pythona, który zawiera moduły podrzędne i używa numpy / scipy. Ipython jest używany jako interaktywna konsola. Niestety nie jestem bardzo zadowolony z workflow, z którego obecnie korzystam, byłbym wdzięczny za radę.

W Ipythonie framework jest ładowany przez proste polecenie import. Często jednak konieczna jest zmiana kodu w jednym z podmodułów frameworka. W tym momencie model jest już załadowany i używam Ipythona do interakcji z nim.

Teraz framework zawiera wiele modułów, które zależą od siebie, tzn. gdy framework jest wstępnie załadowany, główny moduł importuje i konfiguruje moduły podrzędne. Zmiany w kodzie są wykonywane tylko wtedy, gdy moduł jest przeładowywany za pomocą reload(main_mod.sub_mod). Jest to uciążliwe, ponieważ muszę przeładować wszystkie zmienione Moduły indywidualnie przy użyciu pełnej ścieżki. Byłoby bardzo wygodne, gdyby reload(main_module) przeładowywał również wszystkie moduły podrzędne, ale bez przeładowywania numpy/scipy..

Author: Aaron Hall, 2011-03-19

9 answers

IPython posiada pewneautomatyczne przeładowanie Magia:

%load_ext autoreload
%autoreload 2

Przeładuje wszystkie zmienione moduły za każdym razem przed wykonaniem nowej linii. Sposób działania jest nieco inny niż dreload. Istnieją pewne zastrzeżenia, wpisz %autoreload?, aby zobaczyć, co może pójść nie tak.


Jeśli chcesz zawsze włączyć te ustawienia, zmodyfikuj swój plik konfiguracyjny IPython ~/.ipython/profile_default/ipython_config.py [1] i dodaj:

c.InteractiveShellApp.extensions = ['autoreload']     
c.InteractiveShellApp.exec_lines = ['%autoreload 2']

podziękowania dla @Kos poprzez komentarz poniżej.

[1] Jeśli nie Masz plik ~/.ipython/profile_default/ipython_config.py, musisz najpierw zadzwonić ipython profile create. Lub plik może znajdować się pod adresem $IPYTHONDIR.

 397
Author: pv.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-25 16:02:04

W Ipythonie 0.12 (i ewentualnie wcześniej) możesz użyć tego:

%load_ext autoreload
%autoreload 2

Jest to zasadniczo to samo, co odpowiedź pv., z tą różnicą, że rozszerzenie zostało zmienione i jest teraz ładowane za pomocą %load_ext.

 23
Author: RafG,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:12

IPython oferuje dreload() rekurencyjnie przeładować wszystkie moduły podrzędne. Osobiście wolę używać %run() magiczne polecenie (choć nie wykonuje głębokiego przeładowania, jak zauważył John Salvatier w komentarzach).

 18
Author: Sven Marnach,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-21 12:28:40

Z jakiegoś powodu, ani %autoreload, ani dreload nie wydają się działać w sytuacji, gdy importujesz kod z jednego notatnika do drugiego. Tylko zwykły Python reload działa:

reload(module)

Na podstawie [1].

 13
Author: Dennis Golomazov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:46

A może tak:

import inspect

# needs to be primed with an empty set for loaded
def recursively_reload_all_submodules(module, loaded=None):
    for name in dir(module):
        member = getattr(module, name)
        if inspect.ismodule(member) and member not in loaded:
            recursively_reload_all_submodules(member, loaded)
    loaded.add(module)
    reload(module)

import mymodule
recursively_reload_all_submodules(mymodule, set())

Powinno to skutecznie przeładować całe drzewo modułów i podmodułów, które mu podasz. Możesz również umieścić tę funkcję w swoim .ipythonrc (tak mi się wydaje) jest ładowany za każdym razem, gdy uruchamiasz interpreter.

 3
Author: Y.H Wong,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-19 22:27:03

Http://shawnleezx.github.io/blog/2015/08/03/some-notes-on-ipython-startup-script/

Aby uniknąć wielokrotnego wpisywania tych magicznych funkcji, można je umieścić w skrypcie startowym ipython(nazwij go przyrostkiem. py pod.ipython / profile_default / startup. Wszystkie skrypty Pythona znajdujące się w tym folderze będą ładowane zgodnie z kolejnością leksykalną), która wygląda następująco:

from IPython import get_ipython
ipython = get_ipython()

ipython.magic("pylab")
ipython.magic("load_ext autoreload")
ipython.magic("autoreload 2")
 2
Author: Pegasus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-06 11:48:00

Inna opcja:

$ cat << EOF > ~/.ipython/profile_default/startup/50-autoreload.ipy
%load_ext autoreload
%autoreload 2
EOF

Zweryfikowane na ipython i ipython3 v5. 1. 0 Na Ubuntu 14.04.

 1
Author: Chad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-23 05:04:56

Uruchamianie skryptu w IPython3 nie przeładowywało modułów podczas używania magii %autoreload.

%run my_script.py

# Make changes to `my_module` imported inside `my_script.py`

%load_ext autoreload
%autoreload 2

%run my_script.py

# changes not loaded

Zadziałało dla mnie:

%run my_script.py

# Make changes to `my_module` imported inside `my_script.py`

from IPython.lib.deepreload import reload
reload(my_module_name)

%run my_script.py

# changes correctly loaded
 0
Author: ryanjdillon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-24 12:42:10

Na notebookach Jupytera na Anakondzie, robi to:

%load_ext autoreload
%autoreload 2

Wyprodukował wiadomość:

Rozszerzenie autoreload jest już załadowane. Aby go przeładować, użyj: %reload_ext autoreload

Wygląda na to, że lepiej to zrobić:

%reload_ext autoreload
%autoreload 2

Informacje o wersji:

Wersja serwera notebooka to 5.0.0 i działa na: Python 3.6.2 / Anaconda, Inc./ (default, Sep 20 2017, 13:35:58) [MSC V. 1900 32 bit (Intel)]

 0
Author: thanks_in_advance,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-26 22:35:02