557 Stimmen

Neuladen von Untermodule in IPython

Derzeit arbeite ich an einem Python-Projekt, das Untermodule enthält und numpy/scipy verwendet. Ipython wird als interaktive Konsole verwendet. Leider bin ich mit dem Workflow, den ich derzeit 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 oft notwendig, Code in einem der Untermodule des Frameworks zu ändern. Zu diesem Zeitpunkt ist bereits ein Modell geladen und ich benutze IPython, um damit zu interagieren.

Das Framework enthält viele Module, die voneinander abhängen, d.h. wenn das Framework initial geladen wird, importiert und konfiguriert das Hauptmodul die Untermodule. Die Änderungen am Code werden nur ausgeführt, wenn das Modul unter Verwendung von reload(main_mod.sub_mod) neu geladen wird. Dies ist umständlich, da ich alle geänderten Module einzeln unter Verwendung des vollständigen Pfads neu laden muss. Es wäre sehr praktisch, wenn reload(main_module) auch alle Untermodule neu laden würde, jedoch ohne numpy/scipy neu zu laden.

0 Stimmen

Würden Sie sich gerne näher auf Allerdings ist es oft notwendig, den Code in einem der Untermodule des Frameworks zu ändern. näher erläutern? Warum ist es also notwendig, den Code zu ändern? Danke

32 Stimmen

@eat: Das Framework wird kontinuierlich weiterentwickelt, daher gibt es ständige Änderungen an der Code-Basis.

2voto

rdmolony Punkte 397

Ich weiß, dass es schon viele Antworten zu einem langen Thread gibt, aber ich habe eine Lösung gefunden, die das rekursive Neuladen von Submodulen bei %run() ermöglicht und die andere vielleicht nützlich finden (ich jedenfalls).

Del das Untermodul, das Sie beim Ausführen aus sys.modules in iPython neu laden möchten:

In[1]: from sys import modules
In[2]: del modules["mymodule.mysubmodule"] # Tabulatoren können wie mymodule.  verwendet werden!

Jetzt wird Ihr Skript dieses Untermodul rekursiv neu laden:

In[3]: %run myscript.py

1voto

Hubert Grzeskowiak Punkte 12801

Beachten Sie, dass das oben genannte autoreload nur in IntelliJ funktioniert, wenn Sie die geänderte Datei manuell speichern (z.B. mit Strg + S oder cmd + S). Es scheint nicht mit der automatischen Speicherung zu funktionieren.

1 Stimmen

Ich bestätige, dass dies auch für PyCharm der Fall ist.

0voto

thanks_in_advance Punkte 2506

Im Jupyter-Notebooks auf Anaconda wird durch das Folgende:

%load_ext autoreload
%autoreload 2

die Meldung produziert:

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

Es scheint bevorzugt zu sein, stattdessen das Folgende zu tun:

%reload_ext autoreload
%autoreload 2

Versionsinformation:

Die Version des Notebook-Servers lautet 5.0.0 und läuft auf: Python 3.6.2 |Anaconda, Inc.| (default, Sep 20 2017, 13:35:58) [MSC v.1900 32 bit (Intel)]

0voto

aoeu256 Punkte 375

Alle Unterobjekte werden dadurch nicht neu geladen, ich glaube, dass du dafür IPython's deepreload verwenden musst.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X