2010-07-30 14 views

Respuesta

5

Tengo una sugerencia, basado en su comentario que describe el flujo de trabajo:

primera, corro python3.1 en segundo terminal, hago "módulo de importación", entonces, corro un método de el módulo permite decir "module.method (arg)" cada vez que trato de depurar el código, tengo que hacer toda esta secuencia, aunque el cambio sea menor. es muy ineficiente

En lugar de activar el shell interactivo de Python, haga que el módulo sea ejecutable. La forma más sencilla de hacerlo es añadir un bloque a la parte inferior del módulo, así:

if __name__ == '__main__': 
    method(arg) # matches what you run manually in the Python shell 

Entonces, en lugar de correr python3.1, a continuación, importar el módulo, a continuación, llamar al método, se puede hacer algo de esta manera:

python3.1 modulename.py 

y Python se ejecuta cualquier código que se encuentra en el bloque de if __name__ == '__main__'. Pero ese código no se ejecutará si el módulo es importado por otro módulo de Python. Se puede encontrar más información sobre este idioma común de Python en in the Python tutorial.

La ventaja de esto es que cuando hace un cambio en su código, generalmente puede volver a ejecutar el módulo presionando la flecha hacia arriba y presionando enter. No es necesaria una recarga desordenada.

+0

¡Gracias! Gran sugerencia :) – nebulus

2

Si solo se trata de un módulo que está cambiando, puede llamar al reload(module) en su secuencia de comandos.

+0

Esto es correcto, pero tenga en cuenta que si sigue el enlace verá que hay varias advertencias. –

1

¿Quiere decir que ingresa la secuencia de comandos directamente en la python interactiva, o está ejecutando su archivo .py desde la terminal ejecutando algo como python myscript.py?

+0

primero, ejecuto python3.1 en la terminal en segundo lugar, hago "módulo de importación" luego, ejecuto un método desde el módulo digamos "module.method (arg)" cada vez que trato de depurar el código, tengo que hacer todo este secuencia, aunque el cambio es menor. es muy ineficiente – nebulus

+0

* Actualización: * Veo que Will McCutchen me golpeó hasta el golpe. Lo que tendrá que hacer es escribir la secuencia de comandos en un archivo en lugar de hacerlo en la terminal. Digamos, por ejemplo, su archivo se llama "myscript.py". Escriba todos los comandos en ese momento simplemente 'python3.1 myscript.py' en la misma carpeta donde se coloca el script y se ejecutará. De esta forma, no tiene que escribir los comandos todo el tiempo. ¿Qué SO estás ejecutando, Windows? –

0

Puede usar reload para volver a importar un módulo. Lo uso con frecuencia cuando uso el modo interactivo para depurar código.

Sin embargo, desde un nivel superior, me resistiría a utilizarlo en una versión de producción de un programa. A menos que tenga un control muy estricto sobre cómo están cambiando los submódulos, no sería difícil que el módulo recargado cambie de alguna manera que rompa su programa. A menos que su programa realmente necesite un 100% de tiempo de actividad, tendría sentido detenerlo y volverlo a iniciar cuando haya algún tipo de cambio de versión.

+0

la recarga no funciona en el terminal. – nebulus

+1

Para Python 3, la recarga se movió a 'imp', por lo que tendrás que' importar imp' y luego 'imp.reload (mod)' – AdmiralNemo

0

Encontré un bypass en línea. Los comandos mágicos existen. Funciona como un encanto para mí. La opción Recargar no funcionó para mí. Lo obtuve desde here y el punto 3 de este enlace.

Básicamente todo lo que tiene que hacer es lo siguiente: y los cambios que realice se reflejan automáticamente después de guardar.

In [1]: %load_ext autoreload 

In [2]: %autoreload 2 

In [3]: Import MODULE 

In [4]: my_class = Module.class() 
     my_class.printham() 
Out[4]: ham 

In [5]: #make changes to printham and save 
In [6]: my_class.printham() 
Out[6]: hamlet 
Cuestiones relacionadas