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?
Respuesta
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.
¿Qué pasa? PyLint? – detly
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
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
Python proporciona un depurador que le permite recorrer su código, inspeccionar variables y manipularlas. Se refieren a http://pythonconquerstheuniverse.wordpress.com/category/python-debugger/, que le llevará a través de los pasos ...
consultar también la pitón referencia de la biblioteca estándar para pdb http://www.python.org/doc/2.5.2/lib/module-pdb.html
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.
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
Utilizando la declaración de afirmación liberalmente.
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.
Eso es un montón de cosas. –
@ 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. –
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.
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ónif __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.
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
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
Buena información sobre Winpdb, thx – hopla
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.
Hay un buen depurador GUI para Python llamado Winpdb. Pruébalo. Creado en la biblioteca wxWidgets y multiplataforma.
Eric4 IDE también tiene un gran depurador incorporado.
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. :)
Soy nuevo en python, y he estado probando varios depuradores diferentes.Estas son las opciones que he encontrado hasta ahora:
- Eclipse con PyDev - Si usted ya está usando Eclipse, este es probablemente el camino a seguir. El depurador funciona bien y es bastante funcional.
- 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.
- WinPDB - Probando esto a continuación. Parece muy funcional, y puedo usar cualquier editor que elija.
- PDB - No lo he intentado todavía porque he leído que WinPDB es una mejor alternativa.
- Ipython con el comando% run - He usado IPython, pero no como un depurador como este. Necesito probar esto. (Gracias por la sugerencia, EOL)
- Eric IDE - También en la lista para probar.
- 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:
- 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.
- módulo gc - Interactúa directamente con el recolector de basura.
- 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.
Para una experiencia más integrada se puede utilizar IDE completo soplado como PyCharm:
http://blog.jetbrains.com/pycharm/files/2011/05/template-debug2.png
- 1. ¿Cuáles son algunas buenas maneras de hacer el bloqueo intermachine?
- 2. ¿Cuáles son buenas maneras de monitorear el estado del servidor?
- 3. ¿Cuáles son las maneras elegantes de hacer MixIns en Python?
- 4. ¿Cuáles son buenas maneras de probar una página de inicio de sesión?
- 5. ¿Cómo hacer que un bookmarklet se ejecute solo una vez?
- 6. ¿Cuáles son algunas buenas soluciones de ORM de Python?
- 7. ¿Cuáles son algunas buenas maneras de aprovechar los operadores bit a bit?
- 8. ¿Cuáles son algunas buenas maneras de implementar la eliminación de llamadas finales?
- 9. ¿Cuáles son algunas buenas maneras de establecer una ruta en una secuencia de comandos de Python compatible con Multi-OS
- 10. ¿Cuáles son las cosas buenas de baba?
- 11. ¿Por qué las animaciones de iOS son lentas la primera vez que se ejecutan?
- 12. cómo hacer que jenkins ejecute un script de python que ejecute una compilación?
- 13. ¿Cuáles son las diferentes maneras de reemplazar un cursor?
- 14. Xcode: cómo hacer que PickerView comience en una fila determinada cuando se muestra por primera vez
- 15. ¿Cómo configurar una tarea CRON para que se ejecute solo una vez por conjunto de instancias?
- 16. Instalación de Django por primera vez
- 17. ¿Cuáles son algunas buenas soluciones de autorizaciones de roles que se usan con Authlogic?
- 18. ¿Se puede ejecutar algún código cuando desplegamos por primera vez un archivo WAR?
- 19. ¿Cómo puedo hacer que mi servidor TCP se ejecute para siempre?
- 20. ¿Agregar código al complemento que solo se ejecuta la primera vez que se activa?
- 21. ¿Cuáles son algunas buenas herramientas gratuitas de HttpDebugging?
- 22. ¿Cómo puedo hacer que mi código de Python permanezca por debajo de 80 caracteres por línea?
- 23. ¿Cómo hacer que gdb ejecute una función definida por el usuario (definida en .gdbinit) cada vez que se inicia?
- 24. ¿Cuáles son algunas buenas estrategias para corregir errores a medida que el código se vuelve más complejo?
- 25. HttpWebRequest se ejecuta lentamente por primera vez dentro de SQLCLR
- 26. ¿Cuáles son las buenas reglas generales para las importaciones de Python?
- 27. Cómo hacer que el conjunto guarde silencio después de guardar el modelo por primera vez
- 28. ¿Cuáles son las buenas convenciones de nomenclatura objetivo?
- 29. ¿Cuáles son las buenas prácticas de diseño cuando se trabaja con Entity Framework
- 30. Cómo hacer que mi código sea rápido
La situación depurador ha cambiado mucho desde 2008. Hay una lista de Python depuradores aquí: http: // wiki .python.org/moin/PythonDebuggers –
La lista se movió a http://wiki.python.org/moin/PythonDebuggingTools – camelNeck
Thonny (http://thonny.cs.ut.ee) tiene un buen depurador fácil de usar para principiantes – Aivar