Maison >développement back-end >Tutoriel Python >Comment déboguer Python ?

Comment déboguer Python ?

青灯夜游
青灯夜游original
2019-05-22 13:55:3816383parcourir

La probabilité que le programme puisse être écrit une fois et exécuté normalement est très faible, fondamentalement pas plus de 1 %. Il y a toujours divers bugs qui doivent être corrigés. Certains bugs sont très simples. Vous pouvez le savoir en regardant le message d'erreur. Certains bugs sont très compliqués. Nous devons donc savoir quelles variables ont des valeurs correctes et quelles variables ont des valeurs incorrectes lorsqu'une erreur se produit. un ensemble complet de moyens pour déboguer le programme afin de corriger le bug. L'article suivant vous présentera la méthode de débogage Python, j'espère qu'il vous sera utile.

Comment déboguer Python ?

Méthode 1 : imprimer

Utilisez print pour imprimer les variables qui peuvent avoir des problèmes. Cette méthode est la plus simple. la brutalité est efficace.

# err.py
def foo(s):
  n = int(s)
  print '>>> n = %d' % n
  return 10 / n

def main():
  foo('0')

main()

Après l'exécution, recherchez la valeur de la variable imprimée dans la sortie :

$ python err.py
>>> n = 0
Traceback (most recent call last):
 ...
ZeropisionError: integer pision or modulo by zero

Le plus gros inconvénient de l'utilisation de print est que vous devrez la supprimer à l'avenir. Pensez au fait qu'il y en a. s'imprime partout dans le programme, et les résultats en cours d'exécution sont également Il contiendra beaucoup de spam.

Méthode 2 : assert

Partout où l'impression est utilisée pour faciliter la visualisation, l'assertion peut être utilisée à la place :

# err.py
def foo(s):
  n = int(s)
  assert n != 0, 'n is zero!'
  return 10 / n

def main():
  foo('0')

assert signifie que le l'expression n != 0 doit être vraie, sinon le code suivant fonctionnera mal.

Si l'assertion échoue, l'instruction assert elle-même lancera AssertionError :

$ python err.py
Traceback (most recent call last):
 ...
AssertionError: n is zero!

Si le programme est plein d'assertions, ce ne sera pas mieux que print. Cependant, vous pouvez utiliser le paramètre -O pour désactiver assert lors du démarrage de l'interpréteur Python :

$ python -O err.py
Traceback (most recent call last):
 ...
ZeropisionError: integer pision or modulo by zero

Après l'avoir désactivé, vous pouvez afficher toutes les instructions assert comme des passes.

Méthode 3 : journalisation

Vous pouvez également remplacer print par logging Par rapport à assert, la journalisation ne générera pas d'erreur et peut être sortie dans un fichier. :

# err.py
import logging

s = '0'
n = int(s)
logging.info('n = %d' % n)
print 10 / n

logging.info() peut générer un morceau de texte. Exécutez-le et constatez qu'il n'y a aucune information à l'exception de ZeropisionError. Que se passe-t-il?

Ne vous inquiétez pas, ajoutez une ligne de configuration après la journalisation de l'importation et réessayez :

import logging
logging.basicConfig(level=logging.INFO)

Voir le résultat :

$ python err.py
INFO:root:n = 0
Traceback (most recent call last):
 File "err.py", line 8, in <module>
  print 10 / n
ZeropisionError: integer pision or modulo by zero

C'est l'avantage de la journalisation , cela vous permet de spécifier le niveau d'informations de journalisation, y compris le débogage, les informations, l'avertissement, l'erreur, etc. Lorsque nous spécifions level=INFO, logging.debug ne fonctionnera pas. De la même manière, après avoir spécifié level=WARNING, le débogage et les informations ne fonctionneront pas. De cette façon, vous pouvez générer en toute sécurité différents niveaux d'informations sans les supprimer, et enfin contrôler quel niveau d'informations est généré.

Un autre avantage de la journalisation est que grâce à une configuration simple, une instruction peut être sortie simultanément vers différents endroits, tels que la console et le fichier.

Méthode 4 : Débogueur pdb

Démarrez le débogueur Python pdb, laissez le programme s'exécuter en mode une seule étape et vous pouvez vérifier l'état d'exécution à tout moment. On prépare d'abord le programme :

# err.py
s = &#39;0&#39;
n = int(s)
print 10 / n

puis on démarre :

$ python -m pdb err.py
> /Users/michael/Github/sicp/err.py(2)<module>()
-> s = &#39;0&#39;

Après avoir démarré avec le paramètre -m pdb, pdb localise le code à exécuter ensuite -> Saisissez la commande l pour afficher le code :

(Pdb) l
 1   # err.py
 2 -> s = &#39;0&#39;
 3   n = int(s)
 4   print 10 / n
[EOF]

Saisissez la commande n pour parcourir le code :

(Pdb) n
> /Users/michael/Github/sicp/err.py(3)<module>()
-> n = int(s)
(Pdb) n
> /Users/michael/Github/sicp/err.py(4)<module>()
-> print 10 / n

A tout moment, vous pouvez saisir la commande p nom de la variable pour visualiser la variable :

(Pdb) p s
&#39;0&#39;
(Pdb) p n
0

Entrez la commande q pour terminer le débogage et quitter le programme :

(Pdb) n
ZeropisionError: &#39;integer pision or modulo by zero&#39;
> /Users/michael/Github/sicp/err.py(4)<module>()
-> print 10 / n
(Pdb) q

Cette méthode de débogage en ligne de commande via pdb est théoriquement omnipotente, mais elle est vraiment gênante s'il y en a. mille lignes de code, vous devez l'exécuter jusqu'à la première. Combien de commandes faut-il pour taper 999 lignes ?

Résumé

La chose la plus pénible dans l'écriture d'un programme est le débogage. Le programme s'exécute souvent selon un processus inattendu et les instructions que vous attendez d'être exécutées ne sont pas exécutées. du tout, à ce stade, le débogage est nécessaire.

Recommandations d'apprentissage associées : Tutoriel Python

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn