wake-up-neo.net

Submodule in IPython neu laden

Zur Zeit arbeite ich an einem Python-Projekt, das Submodule enthält und numpy/scipy verwendet. Ipython wird als interaktive Konsole verwendet. Leider bin ich mit dem Workflow, den ich gerade verwende, nicht sehr zufrieden, ich würde mich über Ratschläge freuen.

In IPython wird das Framework mit einem einfachen import-Befehl geladen. Es ist jedoch häufig notwendig, den Code in einem der Submodule des Frameworks zu ändern. Zu diesem Zeitpunkt ist ein Modell bereits geladen und ich benutze IPython, um damit zu interagieren. 

Nun enthält das Framework viele Module, die voneinander abhängig sind, d. H. Wenn das Framework anfänglich geladen wird, importiert und konfiguriert das Hauptmodul die Submodule. Die Änderungen am Code werden nur ausgeführt, wenn das Modul mit reload(main_mod.sub_mod) neu geladen wird. Dies ist umständlich, da ich alle geänderten Module einzeln mit dem vollständigen Pfad neu laden muss. Es wäre sehr praktisch, wenn reload(main_module) auch alle Submodule neu laden würde, ohne jedoch numpy/scipy erneut zu laden.

303
Alain

IPython enthält einige automatisches Nachladen Magie:

%load_ext autoreload
%autoreload 2

Es werden alle geänderten Module jedes Mal neu geladen, bevor eine neue Zeile ausgeführt wird. Die Funktionsweise unterscheidet sich geringfügig von dreload. Es gibt einige Vorbehalte, geben Sie %autoreload? ein, um zu sehen, was schief gehen kann.


Wenn Sie diese Einstellungen immer aktivieren möchten, ändern Sie Ihre IPython-Konfigurationsdatei ~/.ipython/profile_default/ipython_config.py [1] und fügen Sie Folgendes hinzu:

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

Credit an @Kos über einen Kommentar unten.

[1] .__ Wenn Sie die Datei ~/.ipython/profile_default/ipython_config.py nicht haben, müssen Sie zuerst ipython profile create aufrufen. Oder die Datei befindet sich unter $IPYTHONDIR.

427
pv.

In IPython 0.12 (und möglicherweise früher) können Sie Folgendes verwenden:

%load_ext autoreload
%autoreload 2

Dies entspricht im Wesentlichen der Antwort von pv. , außer dass die Erweiterung umbenannt wurde und jetzt mit %load_ext geladen wird.

23
RafG

IPython bietet dreload() , um alle Submodule rekursiv neu zu laden. Ich persönlich bevorzuge den Befehl %run() magic (obwohl er kein tiefes Neuladen durchführt, wie John Salvatier in den Kommentaren ausgeführt hat).

18
Sven Marnach

Aus irgendeinem Grund scheinen weder %autoreload noch dreload für die Situation geeignet zu sein, wenn Sie Code von einem Notebook in ein anderes importieren . Nur einfacher Python reload funktioniert:

reload(module)

Basierend auf [1] .

14

Wie wäre es damit:

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())

Dies sollte den gesamten Baum der von Ihnen gegebenen Module und Submodule effektiv neu laden. Sie können diese Funktion auch in Ihre .ipythonrc-Funktion einfügen (denke ich), so dass sie jedes Mal geladen wird, wenn Sie den Interpreter starten.

3
Y.H Wong

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

Um zu vermeiden, diese magischen Funktionen immer wieder einzugeben, können sie in das ipython-Startskript eingefügt werden (benennen Sie es mit .py-Suffix unter .ipython/profile_default/startup. Alle Python-Skripts unter diesem Ordner werden in lexikalischer Reihenfolge geladen) sieht wie folgt aus:

from IPython import get_ipython
ipython = get_ipython()

ipython.magic("pylab")
ipython.magic("load_ext autoreload")
ipython.magic("autoreload 2")
3
Pegasus

Andere Option:

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

Verifiziert auf ipython und ipython3 v5.1.0 auf Ubuntu 14.04.

2
Chad

Nach dem ersten Öffnen von IPython kombiniere ich beide Methoden standardmäßig nach beiden Methoden:

from IPython.lib.deepreload import reload
%load_ext autoreload
%autoreload 2

Das Laden von Modulen vor dem Ausführen führt dazu, dass sie auch bei einer manuellen reload(module_name) nicht erneut geladen werden. Ich bekomme immer noch sehr selten unerklärliche Probleme mit Klassenmethoden, die nicht neu geladen werden, die ich noch nicht untersucht habe.

1
ryanjdillon

Modul mit dem Namen importlib erlaubt den Zugriff auf interne Importe. Insbesondere bietet es Funktion importlib.reload() :

import importlib
importlib.reload(my_module)

Im Gegensatz zu %autoreload setzt importlib.reload() auch die im Modul gesetzten globalen Variablen zurück. In den meisten Fällen ist es das, was Sie wollen.

importlib ist nur seit Python 3.1 verfügbar. Für ältere Versionen müssen Sie das Modul imp verwenden.

0
Jezz

Auf Jupyter Notebooks auf Anaconda:

%load_ext autoreload
%autoreload 2

produzierte die Nachricht:

Die Autoreload-Erweiterung ist bereits geladen. Um es erneut zu laden, verwenden Sie: %reload_ext autoreload

Es sieht so aus, als wäre es besser zu tun:

%reload_ext autoreload
%autoreload 2

Versionsinformation: 

Die Version des Notebook-Servers ist 5.0.0 und läuft unter: Python 3.6.2 | Anaconda, Inc. | (Standardeinstellung: 20. September 2017, 13:35:58 Uhr) [MSC V.1900 32 Bit (Intel)]

0