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..
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
.
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
.
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).
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].
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.
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")
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.
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
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)]
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