tutorial notebook examples python numpy ipython

python - notebook - jupyter r



Recarga de submódulos en IPython (9)

En IPython 0.12 (y posiblemente antes), puedes usar esto:

%load_ext autoreload %autoreload 2

Esto es esencialmente lo mismo que la respuesta de , excepto que la extensión ha sido renombrada y ahora se carga usando %load_ext .

Actualmente estoy trabajando en un proyecto de Python que contiene submódulos y utiliza numpy / scipy. Ipython se utiliza como consola interactiva. Desafortunadamente, no estoy muy contento con el flujo de trabajo que estoy usando en este momento, agradecería algunos consejos.

En IPython, el marco se carga con un simple comando de import . Sin embargo, a menudo es necesario cambiar el código en uno de los submódulos del marco. En este punto, ya hay un modelo cargado y uso IPython para interactuar con él.

Ahora, el marco contiene muchos módulos que dependen unos de otros, es decir, cuando el marco se carga inicialmente, el módulo principal está importando y configurando los submódulos. Los cambios en el código solo se ejecutan si el módulo se reload(main_mod.sub_mod) cargar utilizando reload(main_mod.sub_mod) . Esto es incómodo, ya que necesito volver a cargar todos los módulos modificados individualmente utilizando la ruta completa. Sería muy conveniente si reload(main_module) también recarga todos los submódulos, pero sin recargar numpy / scipy ..


En Jupyter Notebooks en Anaconda, haciendo esto:

%load_ext autoreload %autoreload 2

produjo el mensaje:

La extensión de carga automática ya está cargada. Para recargarlo, usa: %reload_ext autoreload

Parece que es preferible hacer:

%reload_ext autoreload %autoreload 2

Información de versión:

La versión del servidor portátil es 5.0.0 y se está ejecutando en: Python 3.6.2 | Anaconda, Inc. | (predeterminado, 20 de septiembre de 2017, 13:35:58) [MSC v.1900 32 bit (Intel)]


IPython ofrece dreload() para recursivamente recargar todos los submódulos. Personalmente, prefiero usar el comando %run() magic (aunque no realiza una recarga profunda, como lo señala John Salvatier en los comentarios).


IPython viene con algo de magia de recarga automática :

%load_ext autoreload %autoreload 2

Volverá a cargar todos los módulos modificados cada vez que se ejecute una nueva línea. La forma en que esto funciona es ligeramente diferente a la dreload . Algunas advertencias aplican, escriba %autoreload? Para ver qué puede salir mal.

Si desea habilitar siempre esta configuración, modifique su archivo de configuración de IPython ~/.ipython/profile_default/ipython_config.py [1] y agregue:

c.InteractiveShellApp.extensions = [''autoreload''] c.InteractiveShellApp.exec_lines = [''%autoreload 2'']

Crédito a @Kos a través de un comentario a continuación.

[1] Si no tiene el archivo ~/.ipython/profile_default/ipython_config.py , ~/.ipython/profile_default/ipython_config.py debe llamar a ipython profile create . O el archivo puede estar ubicado en $IPYTHONDIR .


La ejecución de un script en IPython3 no IPython3 módulos cuando se usaba el %autoreload magic.

%run my_script.py # Make changes to `my_module` imported inside `my_script.py` %load_ext autoreload %autoreload 2 %run my_script.py # changes not loaded

Lo siguiente me funcionó:

%run my_script.py # Make changes to `my_module` imported inside `my_script.py` from IPython.lib.deepreload import reload reload(my_module_name) %run my_script.py # changes correctly loaded


Otra opción:

$ cat << EOF > ~/.ipython/profile_default/startup/50-autoreload.ipy %load_ext autoreload %autoreload 2 EOF

Verificado en ipython y ipython3 v5.1.0 en Ubuntu 14.04.


Por alguna razón, ni el %autoreload , ni la dreload parecen funcionar para la situación cuando se importa el código de un cuaderno a otro . Sólo funciona la reload Python simple:

reload(module)

Basado en [1] .


Qué tal esto:

import inspect # needs to be primed with an empty set for loaded def recursively_reload_all_submodules(module, loaded=None): for name in dir(module): member = getattr(module, name) if inspect.ismodule(member) and member not in loaded: recursively_reload_all_submodules(member, loaded) loaded.add(module) reload(module) import mymodule recursively_reload_all_submodules(mymodule, set())

Esto debería recargar de manera efectiva todo el árbol de módulos y submódulos que le des. También puede poner esta función en su .ipythonrc (creo) para que se cargue cada vez que inicie el intérprete.


http://shawnleezx.github.io/blog/2015/08/03/some-notes-on-ipython-startup-script/

Para evitar escribir esas funciones mágicas una y otra vez, se podrían colocar en el script de inicio de ipython (Nómbrelo con el sufijo .py bajo .ipython / profile_default / startup. Todos los scripts de Python en esa carpeta se cargarán según el orden léxico), que Se parece a lo siguiente:

from IPython import get_ipython ipython = get_ipython() ipython.magic("pylab") ipython.magic("load_ext autoreload") ipython.magic("autoreload 2")