online notebook python import module ipython

notebook - ipython: volver a importar módulos cuando se usa% run



jupyter r (2)

Estoy encontrando el mismo problema. Me parece que este es un efecto indeseable del comando de ejecución de ipython: no vuelve a cargar los módulos importados.

El autor tiene razón: si se han realizado cambios en ex2.py, el siguiente comando ayudará a recargar

%load_ext autoreload %autoreload 2

Mi forma más sencilla de moverse es modificar los módulos importados (en este ejemplo, ex2.py) cada vez, y ejecutar los siguientes comandos en ipython

%load_ext autoreload %autoreload 2 %run ex1.py

Esto ayuda a recargar ex2.py.

Tenga en cuenta que ex2.py debe modificarse cada vez que ejecute las 3 líneas anteriores. Solo de esta manera el módulo ex2 puede ser recargado.

Me encanta ipython, pero he descubierto un problema con% run: los módulos importados no se vuelven a cargar cuando se llama repetidamente a% run.

Supongamos que el archivo ex1.py contiene las líneas:

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

Y el archivo ex2.py contiene:

x = []

Ahora, ejecutar python ex1.py desde la línea de comandos imprime repetidamente [1] cada vez. Pero la invocación de %run ex1.py desde ipython imprime repetidamente [1], [1,1], [1,1,1], etc. Esto se debe a que el módulo ex2.py no se vuelve a cargar. Así que tenemos un problema: el protocolo de script de ejecución ipython no refleja el comportamiento del "mundo real".

Nota:

%load_ext autoreload %autoreload 2

no ayuda Esas líneas se volverán a cargar ex2.py solo si se ha realizado un cambio en el archivo ex2.py. Si no hacemos ningún cambio, o solo hacemos cambios en ex1.py, obtenemos el comportamiento no deseado.

¿Hay alguna manera de hacer que% run se comporte como la línea de comando aquí? Esto parece una deficiencia real al usar ipython como un entorno de prueba para scripts. (¿O tal vez la moraleja es que un módulo no debería estar escribiendo en el espacio de nombres de otro módulo?)


%run ex1.py (o cualquier secuencia de comandos) no realiza una recarga profunda de su módulo importado, incluso con la extensión de carga automática establecida en 2. Es un "defecto" de cómo %run comando %run en ipython.

Tendrá que llamar explícitamente

dreload(ex2)

para una recarga profunda antes de ejecutar %run ex1.py nuevamente.

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

Es posible que haya planes para hacer que %run recargue en profundidad automáticamente en el futuro y puede encontrar este problema, que aún es un problema pendiente en este momento de la redacción, que sugiere un usuario aquí: https://github.com/ipython/ipython/issues/461