Obecnie pracuję nad projektem Pythona, który zawiera podmoduły i używa numpy / scipy. Ipython jest używany jako interaktywna konsola. Niestety nie jestem zadowolony z przepływu pracy, którego używam teraz, byłbym wdzięczny za porady.
W IPython środowisko jest ładowane za pomocą prostej import
komendy. Jednak często konieczna jest zmiana kodu w jednym z submodułów frameworka. W tym momencie model jest już załadowany i używam IPython do interakcji z nim.
Teraz struktura zawiera wiele modułów, które są od siebie zależne, tzn. Gdy platforma jest początkowo ładowana, moduł główny importuje i konfiguruje submoduły. Zmiany w kodzie są wykonywane tylko wtedy, gdy moduł zostanie przeładowany przy użyciu reload(main_mod.sub_mod)
. Jest to uciążliwe, ponieważ muszę ponownie ładować wszystkie zmienione moduły indywidualnie, korzystając z pełnej ścieżki. Byłoby bardzo wygodne, gdyby reload(main_module)
przeładował również wszystkie podmoduły, ale bez przeładowywania numpy / scipy ..
However, it is often necessary to change code in one of the submodules of the framework.
Więc dlaczegonecessary to change code
? DziękiOdpowiedzi:
IPython zawiera pewną magię automatycznego przeładowywania :
Przeładuje wszystkie zmienione moduły za każdym razem przed wykonaniem nowej linii. Sposób działania jest nieco inny niż
dreload
. Obowiązują pewne zastrzeżenia, wpisz,%autoreload?
aby zobaczyć, co może pójść nie tak.Jeśli chcesz zawsze włączać te ustawienia, zmodyfikuj plik konfiguracyjny IPython
~/.ipython/profile_default/ipython_config.py
[1] i dołącz:Kredyt @Kos poprzez komentarz poniżej.
[1] Jeśli nie masz pliku
~/.ipython/profile_default/ipython_config.py
, musiszipython profile create
najpierw zadzwonić . Lub plik może znajdować się w$IPYTHONDIR
.źródło
c.InteractiveShellApp.extensions = ['autoreload']
ic.InteractiveShellApp.exec_lines = ['%autoreload 2']
w sobie~/.ipython/profile_default/ipython_config.py
.W IPython 0.12 (i prawdopodobnie wcześniej) możesz użyć tego:
Jest to w zasadzie to samo co odpowiedź pv. , z wyjątkiem tego, że rozszerzenie zostało zmienione i jest teraz ładowane przy użyciu
%load_ext
.źródło
Z jakiegoś powodu ani
%autoreload
niedreload
wydaje się, aby działał w sytuacji, gdy importujesz kod z jednego notatnika do drugiego .reload
Działa tylko zwykły Python :Na podstawie [1] .
źródło
%autoreload
techniki. Istnieje otwarty raport o błędach, do którego można dodać wsparcie%autoreload
. .IPython oferuje
dreload()
rekurencyjne przeładowanie wszystkich podmodułów. Osobiście wolę używać%run()
magicznego polecenia (chociaż nie wykonuje ono głębokiego przeładowania, jak zauważył John Salvatier w komentarzach).źródło
dreload
został zastąpiony w ostatnim IPython (np. IPython 6.0) przez deepreload .Nazwany moduł
importlib
pozwala na dostęp do importowanych elementów wewnętrznych. W szczególności zapewnia funkcjęimportlib.reload()
:Przeciwnie
%autoreload
,importlib.reload()
zresetuj także zmienne globalne ustawione w module. W większości przypadków jest to, czego chcesz.importlib
jest dostępna tylko od wersji Python 3.1. W przypadku starszej wersji musisz użyć modułuimp
.źródło
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 je sufiksem .py w .ipython / default_default / startup. Wszystkie skrypty python w tym folderze zostaną załadowane zgodnie z kolejnością leksykalną), które wygląda następująco:
źródło
%run script.py
Z IPython REPLCo powiesz na to:
To powinno skutecznie przeładować całe drzewo modułów i podmodułów, które mu dasz. Możesz także umieścić tę funkcję w swoim .ipythonrc (myślę), aby była ładowana przy każdym uruchomieniu interpretera.
źródło
from ... import ...
lubimport ... as
. Przynajmniej sprawia mi to często problemy podczas interaktywnej pracy na terminalu. Przeszedłem do używania przechowywanych makr w IPython, które wykonują niezbędne importy i konfiguracje, aby rozpocząć pracę w predefiniowanym stanie.from ... import ...
iimport ... as
tak długo, jak importujesz moduł. Jedyne, czego nie obejmuje, to moduły w pakiecie, które nie zostały załadowane z jego__init__.py
pliku. W przypadku pakietów prawdopodobnie można sprawdzić, czy__path__
atrybutem modułu jest katalog. Jeśli tak, przejdź do niego i zaimportuj rekurencyjnie wszystkie moduły, które możesz znaleźć. Nie napisałem tej części, ponieważ autor nie poprosił o rozwiązanie dla pakietów.pkgutil
aby uzyskać wszystkie submoduły w pakiecie, nawet jeśli pakiet nie importuje submodułów do górnego modułu. stackoverflow.com/a/1707786/1243926sys.modules:
Inna opcja:
Zweryfikowano na ipython i ipython3 v5.1.0 na Ubuntu 14.04.
źródło
Moją standardową praktyką dotyczącą przeładowywania jest połączenie obu metod po pierwszym otwarciu
IPython
:Ładowanie modułów przed zrobieniem tego spowoduje, że nie zostaną ponownie załadowane, nawet z instrukcją
reload(module_name)
. Nadal bardzo rzadko spotykam się z niewytłumaczalnymi problemami z metodami klasowymi, które nie przeładowują się, a których jeszcze nie zbadałem.źródło
Zauważ, że wyżej wymienione
autoreload
działa tylko w IntelliJ, jeśli ręcznie zapiszesz zmieniony plik (np. Używając Ctrl + S lub cmd + S). Wydaje się, że nie działa z automatycznym zapisywaniem.źródło
W notesach Jupyter na Anaconda:
wyprodukował wiadomość:
Wygląda na to, że lepiej zrobić:
Informacje o wersji:
źródło
Żadne podobiekty nie zostaną przez to ponownie załadowane, uważam, że musisz do tego użyć głębokiego przeładowania IPython.
źródło