Actualmente estoy trabajando en un proyecto de Python que contiene submódulos y usa numpy / scipy. Ipython se usa 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 mediante un import
comando simple . Sin embargo, a menudo es necesario cambiar el código en uno de los submódulos del marco. En este punto, un modelo ya está 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 vuelve a cargar usando reload(main_mod.sub_mod)
. Esto es engorroso ya que necesito volver a cargar todos los módulos modificados individualmente usando la ruta completa. Sería muy conveniente reload(main_module)
recargar todos los submódulos, pero sin recargar numpy / scipy.
However, it is often necessary to change code in one of the submodules of the framework.
Entonces, por quénecessary to change code
? GraciasRespuestas:
IPython viene con algo de magia de recarga automática :
Recargará todos los módulos modificados cada vez antes de ejecutar una nueva línea. La forma en que esto funciona es ligeramente diferente de
dreload
. Se aplican algunas advertencias, 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: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 create
primero debe llamar . O el archivo puede estar ubicado en$IPYTHONDIR
.fuente
c.InteractiveShellApp.extensions = ['autoreload']
yc.InteractiveShellApp.exec_lines = ['%autoreload 2']
en mi~/.ipython/profile_default/ipython_config.py
.En IPython 0.12 (y posiblemente antes), puede usar esto:
Esto es esencialmente lo mismo que la respuesta de pv. , excepto que la extensión ha cambiado de nombre y ahora se carga con
%load_ext
.fuente
Por alguna razón,
%autoreload
nidreload
parece funcionar para la situación cuando importa código de una computadora portátil a otra . Solo Python simplereload
funciona:Basado en [1] .
fuente
%autoreload
técnica. Hay un informe de error abierto para agregar soporte%autoreload
para esto. .IPython ofrece
dreload()
recargar recursivamente todos los submódulos. Personalmente, prefiero usar el%run()
comando mágico (aunque no realiza una recarga profunda, como lo señala John Salvatier en los comentarios).fuente
dreload
ha sido reemplazado en IPython reciente (por ejemplo, IPython 6.0) por deepreload .El módulo llamado
importlib
permite acceder a las partes internas de importación. Especialmente, proporciona funciónimportlib.reload()
:Por el contrario
%autoreload
,importlib.reload()
también restablece las variables globales establecidas en el módulo. En la mayoría de los casos, es lo que quieres.importlib
solo está disponible desde Python 3.1. Para la versión anterior, debe usar el móduloimp
.fuente
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, podrían colocarse 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 de acuerdo con el orden léxico), que se parece a lo siguiente:
fuente
%run script.py
desde IPython REPLQué tal esto:
Esto debería recargar de manera efectiva todo el árbol de módulos y submódulos que le dé. También puede poner esta función en su .ipythonrc (creo) para que se cargue cada vez que inicie el intérprete.
fuente
from ... import ...
oimport ... as
. Al menos eso me da problemas a menudo cuando trabajo de forma interactiva en la terminal. Pasé a usar macros almacenadas en IPython que hacen las importaciones y configuraciones necesarias para comenzar a trabajar en un estado predefinido.from ... import ...
yimport ... as
siempre que lo que haya importado sea un módulo. Lo único que no cubre son los módulos en un paquete que no se cargaron desde su__init__.py
archivo. Para los paquetes, probablemente pueda verificar si el__path__
atributo del módulo es un directorio. Si es así, recorra e importe recursivamente todos los módulos que pueda encontrar. No escribí esta parte porque el autor no ha pedido una solución para los paquetes.pkgutil
para obtener todos los submódulos en un paquete, incluso si el paquete no importa los submódulos en el módulo superior. stackoverflow.com/a/1707786/1243926sys.modules:
Otra opción:
Verificado en ipython e ipython3 v5.1.0 en Ubuntu 14.04.
fuente
Mi práctica estándar para la recarga es combinar ambos métodos después de la primera apertura de
IPython
:Cargar módulos antes de hacer esto hará que no se vuelvan a cargar, incluso con un manual
reload(module_name)
. Todavía, muy raramente, tengo problemas inexplicables con los métodos de clase que no se vuelven a cargar y que aún no he investigado.fuente
Tenga en cuenta que lo mencionado anteriormente
autoreload
solo funciona en IntelliJ si guarda manualmente el archivo modificado (por ejemplo, usando ctrl + so cmd + s). No parece funcionar con el guardado automático.fuente
En Jupyter Notebooks en Anaconda, haciendo esto:
produjo el mensaje:
Parece que es preferible hacer:
Información de versión:
fuente
Esto no recargará ningún subobjeto, creo que debe usar la recarga profunda de IPython para eso.
fuente