Sé que se puede hacer, pero nunca recuerdo cómo.
¿Cómo se puede reimportar un módulo en Python? El escenario es el siguiente: importo un módulo de forma interactiva y retoco con él, pero luego me enfrento a un error. Arreglo el error en el archivo .py y luego quiero volver a importar el módulo fijo sin salir de Python. Cómo puedo hacerlo ?
Respuestas:
Esto debería funcionar:
De los documentos de Python
Si ejecuta Python 3.4 y versiones posteriores, haga
import importlib
, luego hagaimportlib.reload(nameOfModule)
.No olvide las advertencias de usar este método:
Cuando se recarga un módulo, se retiene su diccionario (que contiene las variables globales del módulo). Las redefiniciones de nombres anularán las definiciones antiguas, por lo que esto generalmente no es un problema, pero si la nueva versión de un módulo no define un nombre que fue definido por la versión anterior, la definición anterior no se elimina.
Si un módulo importa objetos de otro módulo utilizando
from ... import ...
, llamarreload()
al otro módulo no redefine los objetos importados de él; una forma de evitar esto es volver a ejecutar lafrom
instrucción, otra es usarimport
nombres calificados (module.*name*
).Si un módulo crea instancias de instancias de una clase, la recarga del módulo que define la clase no afecta las definiciones de método de las instancias: continúan utilizando la definición de clase anterior. Lo mismo es cierto para las clases derivadas.
fuente
from filename import *
. ¿Cómo recargar?import foo; from foo import bar; reload(foo)
En python 3,
reload
ya no es una función integrada.Si está utilizando python 3.4+, debería utilizarlo
reload
desde laimportlib
biblioteca:Si está utilizando Python 3.2 o 3.3, debe:
en lugar. Ver http://docs.python.org/3.0/library/imp.html#imp.reload
Si está usando
ipython
, definitivamente considere usar laautoreload
extensión:fuente
imp.reload
está en desuso desde Python 3.4, use laimportlib.reload
función en su lugar.from mymodule import myfunc
, entoncesimportlib.reload(myfunc)
,importlib.reload(mymodule.myfunc)
,importlib.reload(mymodule)
todos dan un NameError.En realidad, en Python 3 el módulo
imp
está marcado como DEPRECATED. Bueno, al menos eso es cierto para 3.4.En su lugar , se debe usar la
reload
función delimportlib
módulo:https://docs.python.org/3/library/importlib.html#importlib.reload
Pero tenga en cuenta que esta biblioteca tuvo algunos cambios de API con las dos últimas versiones menores.
fuente
Si desea importar una función o clase específica desde un módulo, puede hacer esto:
fuente
Aunque las respuestas proporcionadas funcionan para un módulo específico, no volverán a cargar submódulos, como se indica en esta respuesta :
Sin embargo, si usa la
__all__
variable para definir la API pública, es posible volver a cargar automáticamente todos los módulos disponibles públicamente:Sin embargo, las advertencias señaladas en la respuesta anterior siguen siendo válidas. En particular, la modificación de un submódulo que no es parte de la API pública como se describe en la
__all__
variable no se verá afectada por una recarga que use esta función. Del mismo modo, la eliminación de un elemento de un submódulo no se reflejará en una recarga.fuente