2012-10-31 4 views
18

Amo ipython, ma ho scoperto un problema con% run: i moduli importati non vengono ricaricati quando% run viene chiamato ripetutamente.ipython: reimportazione di moduli quando si utilizza% run

Supponiamo ex1.py file contiene le linee:

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

e il file contiene ex2.py:

x = [] 

Ora, in esecuzione pitone ex1.py dalla riga di comando ripetutamente stampe [1] ogni volta. Ma invocare %run ex1.py da ipython stampa ripetutamente [1], [1,1], [1,1,1], ecc. Questo perché il modulo ex2.py non viene ricaricato. Quindi abbiamo un problema: il protocollo run-script ipython non riflette il comportamento del "mondo reale".

Nota:

%load_ext autoreload 
%autoreload 2 

fa non aiuto. Quelle linee avranno ex2.py ricaricato solo se è stata apportata una modifica al file ex2.py. Se non apportiamo modifiche o apportiamo solo modifiche a ex1.py, otteniamo il comportamento indesiderato.

C'è un modo per far sì che% run si comporti come la riga di comando qui? Questo sembra un vero problema con l'utilizzo di ipython come ambiente di test per gli script. (O forse la morale è che un modulo non dovrebbe scrivere nello spazio dei nomi di un altro modulo?)

risposta

11

%run ex1.py (o qualsiasi script per quella materia) non esegue il ricaricamento profondo del modulo importato anche con l'estensione di autoregolazione impostata su 2 È un "difetto" con il modo in cui il comando %run funziona in ipython.

Dovrete chiamare esplicitamente

dreload(ex2) 

per una ricarica profonda prima di eseguire di nuovo %run ex1.py.

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

Ci potrebbe essere piani per fare %run fare profondo ricarica automaticamente, in futuro, e si può trovare questo problema, che è ancora una questione aperta in questo momento della scrittura, essere suggerito da un utente qui - https://github.com/ipython/ipython/issues/461

6

Sto incontrando lo stesso problema. Mi sembra che questo sia un effetto indesiderato del comando di esecuzione di ipython: non ricarica i moduli importati.

L'autore ha ragione: se sono state apportate modifiche al ex2.py, il seguente comando contribuirà a ricaricare

%load_ext autoreload 
%autoreload 2 

mio modo più semplice per andare in giro è quello di modificare i moduli importati (in questo esempio , ex2.py) di volta in volta, ed eseguire i seguenti comandi in ipython

%load_ext autoreload 
%autoreload 2 
%run ex1.py 

Questo aiuta ricarica ex2.py.

Nota che ex2.py deve essere modificato ogni volta prima di eseguire le 3 righe sopra. Solo in questo modo è possibile ricaricare il modulo ex2.