2012-10-31 7 views
18

Ich liebe ipython, aber ich habe ein Problem mit% run entdeckt: importierte Module werden nicht neu geladen, wenn% run wiederholt aufgerufen wird.ipython: Module bei Verwendung von% run neu importieren

Angenommen Datei ex1.py enthält die folgenden Zeilen:

import ex2 
ex2.x.append(1) 
print ex2.x 

Und Datei ex2.py enthält:

x = [] 

Nun Python ex1.py von der Linie wiederholt Befehl ausführen druckt [1] jedes Mal. Aber das Aufrufen von %run ex1.py aus ipython wiederholt wiederholt [1], [1,1], [1,1,1] usw. Dies liegt daran, dass Modul ex2.py nicht neu geladen wird. Wir haben also ein Problem: Das ipython run-script-Protokoll spiegelt nicht das "reale" Verhalten wider.

Hinweis:

%load_ext autoreload 
%autoreload 2 

tut nicht Hilfe. Bei diesen Zeilen wird ex2.py nur dann neu geladen, wenn eine Änderung an der Datei ex2.py vorgenommen wurde. Wenn wir keine Änderungen vornehmen oder nur Änderungen an ex1.py vornehmen, erhalten wir das unerwünschte Verhalten.

Gibt es eine Möglichkeit,% run wie die Befehlszeile hier zu verhalten? Dies scheint ein echter Mangel bei der Verwendung von ipython als Testumgebung für Skripte zu sein. (Oder vielleicht ist die Moral, dass ein Modul nicht in eine anderen Modul Namensraum zu schreiben werden?)

Antwort

11

%run ex1.py (oder jedes Skript für diese Angelegenheit) macht nicht tief reload von importierten Modul auch mit der Autonachlademode Erweiterung auf 2 Es ist ein "Fehler", wie der Befehl %run in ipython funktioniert. wieder

werden Sie haben ausdrücklich vor der Ausführung %run ex1.py

dreload(ex2) 

für einen tiefen reload zu nennen. Siehe

-http://ipython.org/ipython-doc/dev/api/generated/IPython.lib.deepreload.html

Es könnte Pläne sein tief Reload automatisch in Zukunft zu machen %run zu tun, und Sie können dieses Problem finden, die zu diesem Zeitpunkt des Schreibens noch eine offene Frage ist, hier von einem Benutzer vorgeschlagen werden - https://github.com/ipython/ipython/issues/461

6

Ich stoße auf das gleiche Problem. Es scheint mir, dass dies ein unerwünschter Effekt des ipython-Befehls run ist - importierte Module werden nicht neu geladen.

Der Autor hat Recht: Wenn Änderungen an ex2.py vorgenommen wurden, der folgende Befehl wird dazu beitragen,

%load_ext autoreload 
%autoreload 2 

Meine einfachste Art und Weise neu zu laden, herum zu erhalten ist zu ändern Sie die importierte Module (in diesem Beispiel ex2.py,) jedes Mal, und führen Sie folgende Befehle in ipython

%load_ext autoreload 
%autoreload 2 
%run ex1.py 

Dies hilft reload ex2.py.

Beachten Sie, dass ex2.py jedes Mal geändert werden muss, bevor Sie die obigen 3 Zeilen ausführen. Nur so kann das Modul ex2 neu geladen werden.