web-dev-qa-db-fra.com

Quels sont les bons moyens pour que mon code Python soit exécuté pour la première fois?

Je reçois pas mal d'erreurs dans mon code. Par conséquent, j'aimerais pouvoir les minimiser au départ ou voir autant d'erreurs que possible avant l'exécution du code. Est-ce possible et si oui, comment faire?

53
Amara

Si vous rencontrez des problèmes de syntaxe, vous pouvez essayer un éditeur avec coloration syntaxique. Jusqu'à ce que vous ayez la sensation d'une langue, les erreurs simples ne vous apparaîtront pas.

La forme la plus simple de débogage consiste simplement à insérer des instructions d'impression. Une façon plus avancée (et extensible) de le faire serait d'utiliser le module logging de la lib std.

L'interpréteur interactif est un merveilleux outil pour travailler avec python, et IPython est une grande amélioration par rapport à la version intégrée REPL (Lire la boucle d'impression Eval).

Si vous voulez réellement parcourir votre code, le débogueur python est appelé pdb , qui peut être appelé à partir de la ligne de commande ou incorporé dans votre code.

Si vous êtes habitué à un IDE entièrement intégré, je recommanderais d'utiliser Eclipse avec pydev, et PyCharm a une excellente offre commerciale, avec la saisie semi-automatique, un accès rapide aux documents et de nombreux raccourcis, parmi de nombreuses autres fonctionnalités intéressantes.

35
JimB

Voici quelques techniques pour faciliter le débogage en Python:

  • utilisez un shell interactif, par exemple ipython . Python est un langage dynamique que vous pouvez explorer votre code au fur et à mesure que vous tapez. Le Shell s'exécute dans la deuxième fenêtre de mon éditeur à tout moment.

  • copier-coller du Shell dans docstrings un code qui illustre une utilisation dominante et les cas d'angle de la fonction (classe, module). doctest.testmod() placé dans une section if __name__=="__main__" permet de tester toutes les docstrings du module. doctest peut être facilement intégré avec nittest .

  • utilisez assert pour des choses qui ne peuvent jamais arriver.

  • print() peut résoudre de nombreux problèmes de débogage; Le module logging convient aux processus python de longue durée).

  • écrire des tests (pas nécessairement avant votre code), les exécuter souvent (automatiquement ou avec une seule touche au maximum); nez fournit des fonctionnalités étendues de découverte de test et d'exécution pour nittest .

  • exécuter pylint de temps en temps.

À ce stade, il y a une petite utilité pour un débogueur formel python. Winpdb est une interface graphique externe multi-plateforme GPL python = débogueur si vous en avez besoin.

30
jfs

Tout ce qui est vraiment cool est facilement démontré dans l'interpréteur interactif. Je pense que cela pourrait être le "gold standard" pour une bonne conception:

Pouvez-vous exercer votre classe de manière interactive?

Si vous pouvez faire des choses de manière interactive, vous pouvez rédiger des tests et des doctests avec la certitude que c'est testable, simple, fiable.

Et, plus important encore, vous pouvez l'explorer de manière interactive. Il n'y a rien de mieux que la gratification instantanée qui vient de taper du code et de voir exactement ce qui se passe.

Les habitudes linguistiques compilées (écrire un tas de choses, déboguer un tas de choses, tester un tas de choses) peuvent être laissées pour compte. Au lieu de cela, vous pouvez écrire un peu de choses, l'explorer, écrire un test formel et ensuite attacher votre petit peu de choses à votre projet final en pleine croissance.

Vous faites toujours la conception globale. Mais vous ne gaspillez pas de temps à écrire du code qui peut ou non fonctionner. Dans Python vous écrivez du code qui fonctionne. Si vous n'êtes pas sûr, vous jouez avec lui de manière interactive jusqu'à ce que vous soyez sûr. Ensuite, vous écrivez du code qui fonctionne.

15
S.Lott

Je suis nouveau sur python et j'ai essayé plusieurs débogueurs différents. Voici les options que j'ai rencontrées jusqu'à présent:

  1. Eclipse avec Pydev - Si vous utilisez déjà Eclipse, c'est probablement la voie à suivre. Le débogueur fonctionne bien et est assez fonctionnel.
  2. Komodo IDE - Un poids léger python IDE. Fondamentalement, un éditeur de texte + un débogueur. C'était très facile à comprendre et à être productif immédiatement.
  3. WinPDB - Essayer celui-ci ensuite. Semble très fonctionnel, et je peux utiliser l'éditeur que je choisis.
  4. PDB - Je n'ai pas encore essayé depuis que j'ai lu comment WinPDB est une meilleure alternative.
  5. Ipython avec la commande% run - J'ai utilisé IPython, mais pas comme débogueur comme celui-ci. Je dois essayer ça. (Merci pour l'astuce, EOL)
  6. Eric IDE - Également sur la liste à essayer.
  7. Impression old-school, affirmations - Simple, utile, mais pas une solution complète.

Débogage mémoire - Pour déboguer des problèmes de mémoire, je suis tombé sur quelques outils:

  1. objgraph - Générera des png de graphiques de référence. Soigné. Il existe également d'autres fonctionnalités, telles que: import objgraph; print (objgraph.show_most_common_types (limit = 10)) affichera les 10 types les plus courants en mémoire.
  2. module gc - Interagissez directement avec le garbage collector.
  3. heapy - Analyseur de tas. Par exemple: depuis guppy import hpy; hp = hpy (); print (hp.heap ()) imprimera les types les plus courants, leur utilisation de la mémoire, etc.

Il s'agit d'une liste très incomplète, mais j'espère que c'est un bon début.

10
scottm

Python fournit un débogueur qui vous permet de parcourir votre code, d'inspecter les variables et de les manipuler. Reportez-vous à http://pythonconquerstheuniverse.wordpress.com/category/python-debugger/ qui peut vous guider dans les étapes ...

Vérifiez également la référence python référence de bibliothèque standard pour pdb http://www.python.org/doc/2.5.2/lib/module-pdb.html

10
Amit

Plus souvent qu'autrement, j'utilise juste un tas de déclarations imprimées.

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

Il est parfois utile de faire quelque chose comme:

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

..avec cela, vous pouvez rapidement désactiver toutes vos instructions d'impression de débogage en remplaçant la variable de débogage par False.

Alors que le débogage d'impression vous mènera très loin dans la plupart des cas, il est parfois difficile de déboguer des choses comme des boucles ou une série de if/else/try/except/etc. Pour cela, un débogueur qui permet de parcourir votre code et de définir des points d'arrêt est utile.

pdb est inclus avec Python. Ici est un bon tutoriel simple à ce sujet. Vous pouvez même faire des choses comme changer des variables pendant l'exécution (ce que le didacticiel couvre). Un tutoriel plus long peut être trouvé ici

Il y a un très joli pdb GUI équivalent - Winpdb

Fondamentalement, vous exécutez winpdb myscript --arg 4 -b 4 puis il charge la commande dans un terminal, vous montre votre code à gauche, avec le courant, une liste de variables locales/globales (et leurs valeurs) et la pile d'appels courante.

Ensuite, vous pouvez parcourir le code en cliquant sur l'étape (ou F6). F5 exécute le code. Si vous cliquez à côté des numéros de ligne, il définit un point d'arrêt, où le code passera automatiquement (lorsque vous appuyez sur Exécuter).

Je le trouve beaucoup plus facile à utiliser et il comporte de nombreuses améliorations supplémentaires (comme le débogage à distance, vous pouvez donc exécuter la partie backend (rpdb2) dans l'application à déboguer, et connectez Winpdb à celle-ci (cryptée). Il prend également en charge le filetage et d'autres choses utiles qui ne sont pas dans PDB. Vous avez également accès à une console de type pdb.

7
dbr

Testez tôt et testez souvent.

Cela ne signifie pas nécessairement de se lancer d'abord dans le pool de conception piloté par les tests (bien que ce ne soit pas une si mauvaise idée). Cela signifie simplement, testez vos objets et méthodes dès que vous avez quelque chose qui fonctionne. N'attendez pas d'avoir une énorme pile de code avant de faire des tests.

Investissez du temps dans l'apprentissage d'un cadre de test. S'il est trivial pour vous de taper un scénario de test, vous le ferez plus probablement. Si vous ne disposez d'aucune sorte de test de framework, cela peut être difficile, alors vous l'éviterez. Alors, prenez tôt de bonnes habitudes et vous aurez moins de problèmes en cours de route.

7
Bryan Oakley

J'ai mis en place Python pour démarrer automatiquement le débogueur quand il y a une exception non capturée, en utilisant cette astuce . De cette façon, vous pouvez facilement examiner l'état du programme sans trop code de journalisation. (De plus, pour m'envoyer un notification Growl .)

Oh, et de cette façon, vous pouvez simplement créer un point d'arrêt dans le code en ajoutant

if answer == 42:
    1/0 
6
Michael Kuhn

Utiliser la déclaration assert généreusement.

5
J S

Le plugin PyDev pour Eclipse est mon outil de choix. Il reconnaît les erreurs de syntaxe simples et les erreurs d'indentation et souligne l'erreur avec une ligne rouge. Il a un débogueur puissant et a même un plugin appelé PyLint qui vous avertit du code dangereux.

Edit: Il a également une trace de pile conviviale sur les erreurs d'exécution, la saisie semi-automatique et quelques autres fonctionnalités astucieuses.

Modifier à nouveau: je n'ai pas remarqué que pydev a été mentionné dans le post supérieur. J'espère avoir apporté quelque chose d'autre à la table.

4
Nailer

L'identification des erreurs avant exécution est le domaine de la vérification/analyse statique. J'ai eu de la chance d'utiliser PyChecker pour la vérification statique de base du code Python.

Le site pycheesecake a un très bon résumé des outils de test pour Python.

4
Andrew Beyer

Il y a un débogueur GUI très agréable pour Python appelé Winpdb . Essayez-le. Construit sur la bibliothèque wxWidgets et multiplateforme.

1
RobertVa

Pour une expérience la plus intégrée, vous pouvez utiliser IDE comme PyCharm:

http://blog.jetbrains.com/pycharm/files/2011/05/template-debug2.pngenter image description here

1
aaimnr

python -m pdb yourcode.py devrait le faire. Vous pouvez également "importer pdb" dans votre code et utiliser pdb.set_trace () pour définir les points d'arrêt. Reportez-vous au manuel pour plus d'informations: http://www.python.org/doc/2.5.2/lib/module-pdb.html

1
Sridhar Iyer

Eric4 IDE possède également un excellent débogueur intégré.

0
fccoelho

IPython Python Shell a un %pdb commande qui appelle automatiquement le débogueur en cas de problème. Vous pouvez ensuite inspecter les variables, parcourir le code, etc.

Vous pouvez exécuter vos programmes depuis IPython avec le %run commande.

Plus généralement, comme cela a été noté dans d'autres réponses, un bon Python Shell est votre ami. Et IPython est votre meilleur ami. :)

0
Eric O Lebigot