2011-04-26 4 views
9

Al escribir o depurar un programa Python, realmente me gusta usar el interruptor de línea de comando -i para poder inspeccionar mis funciones directamente sin tener que ejecutar todo de principio a fin.Cómo recargar mi archivo fuente Python, al interpretarlo interactivamente con "python -i"

Sin embargo, cada vez que hago un cambio en el código, tengo que cerrar y reiniciar mi sesión interactiva, perdiendo todas las variables temporales que podría haber definido. ¿Cómo recargo mi archivo fuente desde el intérprete de Python?


La función incorporada reload parece que fue hecho para esto, pero sólo se puede utilizar con módulos con nombre:

>> import my_prog 
>> print my_prog.x 
-- prints an error, because x is not defined -- 

-- edited my_prog.py to add the x global now... 
>> reload(my_prog) 
>> print my_prog.x 
-- prints x 

Sin embargo, si en lugar de hacer un from my_prog import * en el principio recargar no funciona, y hacer la importación nuevamente tampoco tiene ningún efecto.

Respuesta

12

Esto tiene que ver con la forma en que Python almacena en caché los módulos. Necesita pasar un objeto de módulo para volver a cargar y necesita repetir el comando de importación. Tal vez hay una mejor manera, pero aquí es lo que generalmente utilizo:

>> import my_prog 
>> from my_prog import * 
*** Run some code and debug *** 
>> reload(my_prog); from my_prog import * 
*** Run some code and debug *** 
>> reload(my_prog); from my_prog import * 
+0

aceptados para la concisión. – hugomg

+0

¡Bien, gracias! @smaplebias tiene una descripción más completa para aquellos que están interesados ​​en los detalles más finos. +1 de mi parte –

+0

Heh, gracias Carl :-) +1 de vuelta a ti. – samplebias

10

Cuando se utiliza from my_prog import * usted está tirando de símbolos en el ámbito global del intérprete, por lo reload() no puede cambiar los símbolos globales, sólo atributos de nivel de módulo se cambiará cuando el módulo se vuelva a compilar y vuelva a cargar.

Por ejemplo: myprog.py:

x = 1 

En interepreter:

>>> import myprog 
>>> myprog.x 
1 
>>> from myprog import x 
>>> x 
1 

Ahora Editar configuración de myprog.pyx = 2:

>>> reload(myprog) 
>>> myprog.x 
2 
>>> x 
1 

Repita el from myprog import * para tirar de la SY mbols en el alcance mundial de nuevo:

>>> reload(myprog) 
>>> from myprog import * 
Cuestiones relacionadas