2010-11-06 5 views
48

Tengo un foo.pyla manera de "volver a importar" módulo para Python luego el código cambiado después de la importación

def foo(): 
    print "test" 

En IPython que utilizo:

In [6]: import foo 
In [7]: foo.foo() 
test 

Entonces cambió el foo() a:

def foo(): 
    print "test changed" 

En IPython, el resultado para invocar sigue siendo test:

In [10]: import foo 
In [11]: foo.foo() 
test 

Luego uso:

In [15]: del foo 
In [16]: import foo 
In [17]: foo.foo() 
test 

elimino el foo.pyc en misma carpeta foo.py existe, pero aún ninguna suerte.

¿Sé cómo reimportar el código actualizado en tiempo de ejecución?

+2

duplicado posible de [Vuelva a importar un módulo en Python, mientras interactiva] (http://stackoverflow.com/questions/1254370/reimport-a- module-in-python-while-interactive) – Praveen

Respuesta

62
foo = reload(foo) 
+22

En realidad, simplemente "recargar (foo)" - no es necesario volver a atribuirlo – jsbueno

+0

gracias, funciona en el shell ipython – user478514

+2

No pude hacer que funcione. Estoy obteniendo el argumento TypeError: reload() debe ser el módulo – Burak

55

Además de la respuesta de gnibbler:

Esto cambió en Python 3 a:

>>> import imp 
>>> imp.reload(foo) 

Como @onnodb señala, imp está en desuso en favor de importlib desde Python 3.4:

>>> import importlib 
>>> importlib.reload(foo) 
+4

Solo una pequeña nota al margen: en versiones posteriores de Python 3.x, "imp" está en desuso en favor de "importlib". Funciona de la misma manera, sin embargo. – onnodb

4

Si desea que esto suceda automáticamente, existe la autoreload módulo que viene con iPython.

15

La función autoreload de IPython3 funciona correctamente.

Estoy usando el ejemplo real de la página web. Primero cargue la función 'autorrecarga'.

In []: %load_ext autoreload 
In []: %autoreload 2 

A continuación, importar el módulo que desea probar:

In []: import foo 
In []: foo.some_function() 
Out[]: 42 

foo.py abierto en un editor y cambiar some_function para volver 43

In []: foo.some_function() 
Out[]: 43 

También funciona si importa el funcionar directamente

In []: from foo import some_function 
In []: some_function() 
Out[]: 42 

cambio realice en some_function para volver 43.

In []: some_function() 
Out[]: 43 
Cuestiones relacionadas