2008-11-18 21 views
50

Recibo bastantes errores en mi código. En consecuencia, me gustaría poder minimizarlos desde el principio o ver tantos errores como sea posible antes de la ejecución del código. ¿Es esto posible y si es así, cómo puedo hacer esto?¿Cuáles son buenas maneras de hacer que mi código Python se ejecute por primera vez?

+2

La situación depurador ha cambiado mucho desde 2008. Hay una lista de Python depuradores aquí: http: // wiki .python.org/moin/PythonDebuggers –

+1

La lista se movió a http://wiki.python.org/moin/PythonDebuggingTools – camelNeck

+0

Thonny (http://thonny.cs.ut.ee) tiene un buen depurador fácil de usar para principiantes – Aivar

Respuesta

34

Si tiene problemas con la sintaxis, puede probar un editor con resaltado de sintaxis. Hasta que no tenga la sensación de un idioma, los errores simples no aparecerán solo en usted.

La forma más simple de depuración es simplemente insertar algunas instrucciones de impresión. Una forma más avanzada (y extensible) de hacer esto sería usar el módulo logging de la lib estándar.

El intérprete interactivo es una herramienta maravillosa para trabajar con el código python, y IPython es una gran mejora con respecto a la REPL incorporada (Leer el lazo de impresión de la evaluación).

Si realmente desea pasar por su código, el depurador de python se llama pdb, que se puede llamar desde la línea de comandos o incrustado en el código.

Si está acostumbrado a un IDE completamente integrado, le recomendaría usar Eclipse con pydev, y PyCharm tiene una gran oferta comercial, con autocompletado, acceso rápido a documentos y numerosos atajos, entre muchas otras características interesantes.

+3

¿Qué pasa? PyLint? – detly

+3

IPython es mucho más conveniente que el shell de Python para probar programas: tiene un comando '% run', desencadenamiento automático del depurador, etc. – EOL

+0

En Windows, PTVS es una gran opción. Obtendrá la experiencia Visual Studio de autocompletar, depuración + puntos de interrupción, romper excepciones, le avisará si detecta errores de sintaxis antes de ejecutar su secuencia de comandos y, por supuesto, la ventana interactiva. – Leo

7

primera prueba y la prueba a menudo.

Esto no significa necesariamente saltar al cabezal del grupo de diseño impulsado por la prueba primero (aunque esa no es una mala idea). Simplemente significa probar tus objetos y métodos tan pronto como tengas algo que funcione. No espere hasta que tenga una gran pila de código antes de hacer las pruebas.

Invierta algo de tiempo en aprender un marco de prueba. Si es trivial escribir un caso de prueba, lo más probable es que lo haga. Si no tiene ningún tipo de prueba marco puede ser un dolor por lo que lo evitará. Entonces, establezca buenos hábitos desde el principio y tendrá menos problemas en el futuro.

1

python -m pdb yourcode.py debería hacerlo. Alternativamente, puede "importar pdb" en su código y usar pdb.set_trace() para establecer puntos de interrupción. Consulte el manual para obtener más información: http://www.python.org/doc/2.5.2/lib/module-pdb.html

5

Utilizando la declaración de afirmación liberalmente.

15

Todas las cosas realmente geniales se demuestran fácilmente en el intérprete interactivo. Creo que este podría ser el "estándar de oro" para un buen diseño:

¿Puedes ejercitar tu clase de forma interactiva?

Si puede hacer cosas de manera interactiva, puede escribir pruebas de unidad y pruebas con la certeza de que es comprobable, simple y confiable.

Y, lo que es más importante, puede explorarlo de forma interactiva. No hay nada mejor que la gratificación instantánea que proviene de escribir el código y ver exactamente lo que sucede.

Los hábitos de lenguaje recopilados (escribir un montón de cosas, depurar un montón de cosas, probar un montón de cosas) se pueden dejar atrás. En cambio, puedes escribir un poco de cosas, explorarlas, escribir una prueba formal y luego adjuntar tus pequeñas cosas a tu creciente proyecto final.

Todavía tiene diseño general. Pero no desperdicia tiempo escribiendo código que puede funcionar o no. En Python escribes código que funciona. Si no estás seguro, juegas interactivamente hasta que estés seguro. Luego escribes código que funciona.

+1

Eso es un montón de cosas. –

+2

@ e-satis: demasiadas cosas. Escribir cosas de prueba. Prueba menos cosas. Haz menos cosas. Llegue a la parte de cerveza del día con una mejor actitud. –

4

Identificar los errores antes de la ejecución es el dominio de la comprobación/análisis estáticos. He tenido buena suerte usando PyChecker para la comprobación estática básica del código de Python.

El sitio pycheesecake tiene un muy buen summary of testing tools para Python.

29

Aquí es algunas técnicas para facilitar la depuración en Python:

  • uso shell interactivo por ejemplo, ipython. Python es un lenguaje dinámico en el que puedes explorar tu código mientras escribes. El shell se ejecuta en la segunda ventana de mi editor en todo momento.

  • copiar y pegar desde el shell en docstrings un código que ilustra un uso dominante y casos de esquina de la función (clase, módulo). doctest.testmod() colocado en una sección if __name__=="__main__" permite probar todas las cadenas de documentos en el módulo. doctest se puede integrar fácilmente con unittest.

  • usa assert para cosas que nunca pueden suceder.

  • print() puede resolver muchos problemas de depuración; El módulo logging es adecuado para procesos de python de larga duración.

  • pruebas de escritura (no necesariamente antes de su código), ejecútelas a menudo (automáticamente o con una sola pulsación de tecla); nose proporciona detección extendida de pruebas y funciones en ejecución para unittest.

  • ejecutar pylint ocasionalmente.

En este punto hay un pequeño uso para un depurador de python formal. Winpdb es un depurador de python GPL con interfaz gráfica multiplataforma externo si lo necesita.

+0

+1 para IPython. – EOL

+0

@ J.F.Sebastian instalando pylint ha cambiado ya sea la instalación de paquetes, la instalación de instalación en Linux o la instalación de pip. ¡No podría ser más sencillo! vea http://www.pylint.org/ – lxx

6

Configuré Python para iniciar automáticamente el depurador cuando hay una excepción no detectada, usando this trick. De esta forma, puede examinar fácilmente el estado del programa sin demasiado código de registro. (Además, para enviarme un Growl notification.)

Ah, y de esta manera usted solo puede crear un punto de interrupción en el código añadiendo

if answer == 42: 
    1/0 
+1

Usando 'raise Exception' o 'raise Exception ("blah no debería ser 42, es% s"% (blah))' sería un poco más Python'y .. – dbr

+0

Estoy de acuerdo :) pero 1/0 hace lo mismo en solo tres teclas. –

+0

+1 por 1/0: eso es lo que uso todo el tiempo. :) – EOL

7

Más a menudo que no, sólo tiene que utilizar un montón de impresión declaraciones.

page = grabpage(url) 
print "Page content:", page 
print "page type():", type(page) 

A veces es útil para hacer algo como:

debug = True 
if debug: print "page content", page 

..con ello se puede desactivar rápidamente todas sus declaraciones de impresión depuración cambiando la variable de depuración en Falso.

Mientras que la depuración de impresión lo llevará muy lejos en la mayoría de los casos, a veces es difícil depurar cosas como bucles, o una serie de if/else/try/except/etc. Para esto, es útil un depurador que permita avanzar a través de su código y establecer puntos de interrupción.

pdb se incluye con Python. Here es un buen tutorial simple sobre el mismo. Incluso puede hacer cosas como cambiar variables durante el tiempo de ejecución (que cubre el tutorial). Un tutorial ya se puede encontrar here

Hay una interfaz gráfica de usuario muy agradable equivalente AP - Winpdb

Básicamente se ejecute winpdb myscript --arg 4 -b 4 entonces se carga el orden en una terminal, que muestra su código de la izquierda, con la corriente, una lista de variables locales/globales (y sus valores) y la pila de llamadas actual.

Luego puede recorrer el código haciendo clic en el Paso (o F6). F5 ejecuta el código. Si hace clic en al lado de los números de línea, establece un punto de interrupción, donde el código pasará automáticamente (cuando presiona ejecutar).

Me resulta mucho más fácil de usar, y tiene muchas mejoras adicionales (como la depuración remota, por lo que puede ejecutar la parte backend (rpdb2) en la aplicación a eliminar y conectar Winpdb a ella (cifrado) También tiene soporte para subprocesos y otras cosas útiles que no están en PDB. También tiene acceso a una consola tipo pdb

+1

Buena información sobre Winpdb, thx – hopla

4

El plugin de PyDev para eclipse es mi herramienta de elección. Reconoce errores de sintaxis simples y errores de sangría y subraya el error con una línea roja. Tiene un potente depurador e incluso tiene un complemento llamado PyLint que le advierte sobre el código peligroso.

Editar: También tiene un seguimiento de pila fácil de usar en los errores de tiempo de ejecución, autocompletar parcial y algunas otras características ingeniosas.

Editar nuevamente: No me di cuenta de que pydev se mencionó en la publicación superior. Espero haber traído algo más a la mesa.

1

Hay un buen depurador GUI para Python llamado Winpdb. Pruébalo. Creado en la biblioteca wxWidgets y multiplataforma.

0

Eric4 IDE también tiene un gran depurador incorporado.

0

El shell Python de IPython tiene un comando %pdb que automatically invokes the debugger en caso de problema. A continuación, puede inspeccionar variables, recorrer el código, etc.

Puede run your programs desde IPython con el comando %run.

De manera más general, como se ha observado en algunas otras respuestas, un buen caparazón de Python es tu amigo. E IPython es tu mejor amigo. :)

10

Soy nuevo en python, y he estado probando varios depuradores diferentes.Estas son las opciones que he encontrado hasta ahora:

  1. Eclipse con PyDev - Si usted ya está usando Eclipse, este es probablemente el camino a seguir. El depurador funciona bien y es bastante funcional.
  2. Komodo IDE - Un IDE pitón ligero. Básicamente un editor de texto + un depurador. Fue muy fácil descubrirlo y ser productivo de inmediato.
  3. WinPDB - Probando esto a continuación. Parece muy funcional, y puedo usar cualquier editor que elija.
  4. PDB - No lo he intentado todavía porque he leído que WinPDB es una mejor alternativa.
  5. Ipython con el comando% run - He usado IPython, pero no como un depurador como este. Necesito probar esto. (Gracias por la sugerencia, EOL)
  6. Eric IDE - También en la lista para probar.
  7. Impresión de la vieja escuela, afirmar declaraciones - Simple, útil, pero no una solución completa.

depuración de memoria - Para los problemas de memoria de depuración, me he encontrado con algunas herramientas:

  1. objgraph - Generará png de gráficos de referencia. Ordenado. También hay otras funciones, como: import objgraph; print (objgraph.show_most_common_types (limit = 10)) imprimirá los 10 tipos más comunes en la memoria.
  2. módulo gc - Interactúa directamente con el recolector de basura.
  3. heapy - Heap analyzer. Por ejemplo: de guppy import hpy; hp = hpy(); print (hp.heap()) imprimirá los tipos más comunes, su uso de memoria, etc.

Esta es una lista muy incompleta, pero espero que sea un buen comienzo.

Cuestiones relacionadas