164 votes

Conseils de débogage Python

Quels sont vos meilleurs conseils pour déboguer Python?

Merci de ne pas simplement lister un débogueur particulier sans dire ce qu'il peut réellement faire.

en relation

139voto

ghostdog74 Points 86060

APB

Vous pouvez utiliser l'apb module, insérez pdb.set_trace() n'importe où et il va fonctionner comme un point d'arrêt.

>>> import pdb
>>> a="a string"
>>> pdb.set_trace()
--Return--
> <stdin>(1)<module>()->None
(Pdb) p a
'a string'
(Pdb)

Pour poursuivre l'exécution d'utilisation c (ou cont ou continue).

Il est possible d'exécuter des commandes arbitraires des expressions Python à l'aide de l'apb. Par exemple, si vous trouvez une erreur, vous pouvez corriger le code, puis tapez une expression de type à avoir le même effet dans le code en cours d'exécution

ipdb est une version de l'apb pour IPython. Il permet l'utilisation de l'apb avec tous les IPython fonctionnalités, y compris la saisie semi-automatique.

Il est également possible de définir apb pour exécuter automatiquement sur une exception non interceptée.

Pydb a été écrit pour être une version améliorée de l'Apb. Avantages?

78voto

miku Points 63392

http://pypi.python.org/pypi/pudb, en plein écran, la console Python débogueur.

Son objectif est de fournir toutes les finesses de moderne basé sur l'interface débogueurs dans un plus léger et facile à piloter au clavier paquet. PuDB vous permet de déboguer le code là où vous écrivez et testez – le dans un terminal. Si vous avez travaillé avec l'excellent (mais de nos jours l'ancien), DOS à base de Turbo Pascal ou C outils, PuDB de l'INTERFACE utilisateur peut paraître familier.

pudb screenshot

Nice pour le débogage des scripts autonomes, il suffit d'exécuter

python -m pudb.run my-script.py

40voto

Ned Batchelder Points 128913

Si vous utilisez pdb, vous pouvez définir des alias pour les raccourcis. Je les utilise:

 # Ned's .pdbrc

# Print a dictionary, sorted. %1 is the dict, %2 is the prefix for the names.
alias p_ for k in sorted(%1.keys()): print "%s%-15s= %-80.80s" % ("%2",k,repr(%1[k]))

# Print the instance variables of a thing.
alias pi p_ %1.__dict__ %1.

# Print the instance variables of self.
alias ps pi self

# Print the locals.
alias pl p_ locals() local:

# Next and list, and step and list.
alias nl n;;l
alias sl s;;l

# Short cuts for walking up and down the stack
alias uu u;;u
alias uuu u;;u;;u
alias uuuu u;;u;;u;;u
alias uuuuu u;;u;;u;;u;;u
alias dd d;;d
alias ddd d;;d;;d
alias dddd d;;d;;d;;d
alias ddddd d;;d;;d;;d;;d
 

33voto

steveha Points 24808

La journalisation

Python dispose déjà d'une excellente intégré dans le module de journalisation. Vous souhaiterez peut-être utiliser la journalisation modèle ici.

Le module de journalisation permet de spécifier un niveau d'importance; au cours de débogage, vous pouvez vous connecter à tout, alors que lors du fonctionnement normal, vous pouvez uniquement connecter critique des choses. Vous pouvez changer les choses et sur.

La plupart des gens utilise d'impression de base des déclarations de débogage, puis supprimer l'impression des déclarations. Il est préférable de les laisser dans la, mais de les désactiver, puis, lorsque vous avez un autre bug, vous pouvez ré-activer tout et regardez vos logs.

Cela peut être la meilleure façon possible de déboguer des programmes qui ont besoin de faire les choses rapidement, tels que la mise en réseau des programmes qui ont besoin de réagir avant que l'autre extrémité de la connexion réseau et s'en va. Vous pourriez ne pas avoir beaucoup de temps pour une seule étape d'un débogueur, mais vous pouvez simplement laisser votre code exécuté, et tout dans le journal, puis penchez-vous sur les journaux et de comprendre ce qui se passe vraiment.

EDIT: L'URL d'origine pour les modèles a été: http://aymanh.com/python-debugging-techniques

Cette page est absent donc je l'ai remplacé par une référence à l'instantané enregistré à archive.org: http://web.archive.org/web/20120819135307/http://aymanh.com/python-debugging-techniques

Dans le cas où il disparaît à nouveau, voici les modèles que j'ai mentionnés. Ce code est pris à partir du blog; je n'ai pas l'écrire.

import logging
import optparse

LOGGING_LEVELS = {'critical': logging.CRITICAL,
                  'error': logging.ERROR,
                  'warning': logging.WARNING,
                  'info': logging.INFO,
                  'debug': logging.DEBUG}

def main():
  parser = optparse.OptionParser()
  parser.add_option('-l', '--logging-level', help='Logging level')
  parser.add_option('-f', '--logging-file', help='Logging file name')
  (options, args) = parser.parse_args()
  logging_level = LOGGING_LEVELS.get(options.logging_level, logging.NOTSET)
  logging.basicConfig(level=logging_level, filename=options.logging_file,
                      format='%(asctime)s %(levelname)s: %(message)s',
                      datefmt='%Y-%m-%d %H:%M:%S')

  # Your program goes here.
  # You can access command-line arguments using the args variable.

if __name__ == '__main__':
  main()

Et voici son explication de la façon d'utiliser le ci-dessus. Encore une fois, je ne suis pas d'obtenir le crédit pour cela:


Par défaut, le module de journalisation imprime critique, d'erreur et messages d'avertissement. Pour changer cela, de sorte que tous les niveaux sont imprimés, utilisez:

$ ./your-program.py --logging=debug

Pour envoyer des messages de log dans un fichier appelé de débogage.le journal:

$ ./your-program.py --logging-level=debug --logging-file=debug.log

20voto

Casebash Points 22106

Il est possible d'imprimer ce que Python lignes sont exécutées (merci Geo!). Cela a n'importe quel nombre d'applications, par exemple, vous pouvez le modifier à vérifier lors de l'utilisation des fonctions sont appelées ou ajouter quelque chose comme: # # faire un suivi particulier des lignes.

code.interagir vous emmène dans une console interactive

import code; code.interact(local=locals())

Si vous voulez être en mesure d'accéder facilement à l'historique de la console de regarder: "puis-je avoir un mécanisme d'historique comme dans le shell?" (ce qui aura pour regarder vers le bas pour elle).

L'Auto-complétion peut être activé pour l' interprète.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X