Derzeit 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 einige Ratschläge freuen.
In IPython wird das Framework durch einen einfachen import
Befehl geladen . Es ist jedoch häufig erforderlich, Code in einem der Submodule des Frameworks zu ändern. Zu diesem Zeitpunkt ist bereits ein Modell geladen und ich verwende IPython, um mit ihm zu interagieren.
Jetzt enthält das Framework viele Module, die voneinander abhängen, dh wenn das Framework zum ersten Mal geladen wird, importiert und konfiguriert das Hauptmodul die Submodule. Die Änderungen am Code werden nur ausgeführt, wenn das Modul mit neu geladen wird reload(main_mod.sub_mod)
. Dies ist umständlich, da ich alle geänderten Module einzeln über den vollständigen Pfad neu laden muss. Es wäre sehr praktisch, wenn reload(main_module)
auch alle Submodule neu geladen würden, ohne jedoch numpy / scipy neu zu laden.
However, it is often necessary to change code in one of the submodules of the framework.
erfahrennecessary to change code
? Warum also ? DankeAntworten:
IPython bietet eine automatische Magie zum Nachladen :
Alle geänderten Module werden jedes Mal neu geladen, bevor eine neue Zeile ausgeführt wird. Die Art und Weise, wie dies funktioniert, ist etwas anders als
dreload
. Es gelten einige Einschränkungen. Geben Sie ein, um%autoreload?
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:Gutschrift an @Kos über einen Kommentar unten.
[1] Wenn Sie die Datei nicht haben
~/.ipython/profile_default/ipython_config.py
, müssen Sieipython profile create
zuerst anrufen . Oder die Datei befindet sich unter$IPYTHONDIR
.quelle
c.InteractiveShellApp.extensions = ['autoreload']
undc.InteractiveShellApp.exec_lines = ['%autoreload 2']
in meinem~/.ipython/profile_default/ipython_config.py
.In IPython 0.12 (und möglicherweise früher) können Sie Folgendes verwenden:
Dies entspricht im Wesentlichen der Antwort von pv. , außer dass die Erweiterung umbenannt wurde und jetzt mit geladen wird
%load_ext
.quelle
Aus irgendeinem Grund scheint es für die Situation, in der Sie Code von einem Notizbuch in ein anderes importieren , weder zu funktionieren
%autoreload
nochdreload
zu funktionieren . Nur einfaches Python funktioniert:reload
Basierend auf [1] .
quelle
%autoreload
Technik beim Hinzufügen einer Instanzmethode . Es gibt einen offenen Fehlerbericht, der%autoreload
diesbezüglich Unterstützung bietet. .IPython bietet
dreload()
an, alle Submodule rekursiv neu zu laden. Persönlich bevorzuge ich die Verwendung des%run()
magischen Befehls (obwohl er kein tiefes Nachladen durchführt, wie John Salvatier in den Kommentaren hervorhob).quelle
dreload
wurde in IPython (z. B. IPython 6.0) durch deepreload ersetzt .Das Modul mit dem Namen
importlib
ermöglicht den Zugriff auf Import-Interna. Insbesondere bietet es Funktionimportlib.reload()
:Im Gegenteil
%autoreload
,importlib.reload()
auch zurückgesetzt global in Modul gesetzt Variablen. 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 Modul verwendenimp
.quelle
http://shawnleezx.github.io/blog/2015/08/03/some-notes-on-ipython-startup-script/
Um zu vermeiden, dass diese magische Funktion immer wieder eingegeben wird, können sie in das ipython-Startskript eingefügt werden (benennen Sie es mit dem Suffix .py unter .ipython / profile_default / startup. Alle Python-Skripte unter diesem Ordner werden in lexikalischer Reihenfolge geladen) sieht wie folgt aus:
quelle
%run script.py
IPython REPL ausführenWie wäre es damit:
Dadurch sollte der gesamte Baum der Module und Submodule, die Sie ihm geben, effektiv neu geladen werden. Sie können diese Funktion auch in Ihre .ipythonrc einfügen (glaube ich), damit sie jedes Mal geladen wird, wenn Sie den Interpreter starten.
quelle
from ... import ...
oder importiert werdenimport ... as
. Zumindest bereitet mir das oft Probleme, wenn ich interaktiv am Terminal arbeite. Ich habe gespeicherte Makros in IPython verwendet, die die erforderlichen Importe und Setups ausführen, um in einem vordefinierten Zustand zu arbeiten.from ... import ...
undimport ... as
solange das, was Sie importiert haben, ein Modul ist. Das einzige, was nicht behandelt wird, sind Module in einem Paket, die nicht aus der__init__.py
Datei geladen wurden . Bei Paketen können Sie wahrscheinlich überprüfen, ob das__path__
Attribut des Moduls ein Verzeichnis ist. Wenn dies der Fall ist, durchlaufen Sie es und importieren Sie rekursiv alle Module, die Sie finden konnten. Ich habe diesen Teil nicht geschrieben, weil der Autor nicht nach einer Lösung für Pakete gefragt hat.pkgutil
alle Submodule in einem Paket abrufen, auch wenn das Paket die Submodule nicht in das oberste Modul importiert. stackoverflow.com/a/1707786/1243926sys.modules:
Andere Option:
Verifiziert unter ipython und ipython3 v5.1.0 unter Ubuntu 14.04.
quelle
Meine Standardpraxis für das Nachladen besteht darin, beide Methoden nach dem ersten Öffnen von zu kombinieren
IPython
:Wenn Sie zuvor Module laden, werden diese auch mit einem Handbuch nicht neu geladen
reload(module_name)
. Ich bekomme immer noch sehr selten unerklärliche Probleme mit Klassenmethoden, die nicht neu geladen werden und die ich noch nicht untersucht habe.quelle
Beachten Sie, dass das oben Genannte
autoreload
in IntelliJ nur funktioniert, wenn Sie die geänderte Datei manuell speichern (z. B. mit Strg + s oder cmd + s). Es scheint nicht mit automatischem Speichern zu funktionieren.quelle
Auf Jupyter Notebooks auf Anaconda gehen Sie folgendermaßen vor:
produzierte die Nachricht:
Es sieht so aus, als wäre es vorzuziehen:
Versionsinformation:
quelle
Unterobjekte werden dadurch nicht neu geladen. Ich glaube, Sie müssen dafür IPythons Deepreload verwenden.
quelle