201 votes

Comment exécuter des instructions multilignes dans le débogueur de Python (PDB) ?

Je lance donc un script Python dans lequel j'appelle le débogueur de Python, PDB, en écrivant :

import ipdb; ipdb.set_trace()

(version iPython de PDB, bien que je ne pense pas que cela fasse une différence ; je l'utilise uniquement pour la sortie colorée).

Maintenant, lorsque j'accède au débogueur, je veux exécuter une instruction de plusieurs lignes telle qu'une clause if ou une boucle for, mais dès que je tape

if condition:

et que j'appuie sur la touche retour, j'obtiens le message d'erreur suivant *** SyntaxError: invalid syntax (<stdin>, line 1)

Comment peut-on exécuter des instructions multilignes dans PDB ? Si ce n'est pas possible, existe-t-il un moyen de contourner ce problème en exécutant une clause if ou une boucle for ?

302voto

Marius Gedminas Points 3299

Vous pouvez le faire pendant que vous êtes dans pdb pour lancer une session Python interactive temporaire avec toutes les variables locales disponibles :

(pdb) !import code; code.interact(local=vars())
Python 2.6.5 (r265:79063, Apr 16 2010, 13:57:41) 
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> 

Lorsque vous avez terminé, utilisez Ctrl-D pour revenir à l'invite normale de pdb.

N'appuyez pas sur Ctrl-C, cela mettrait fin à toute la session pdb.

64 votes

Il semble que la même chose puisse être obtenue en utilisant le pdb interact commande ( comme je l'ai appris dans ce message du bug tracker ).

3 votes

Pourquoi la ! nécessaires dans le cadre de la import déclaration ?

21 votes

Ce n'est probablement pas nécessaire, mais j'ai l'habitude de préfixer toutes les déclarations Python dans pdb avec ! afin d'éviter les accidents. Par exemple c = 42 en pdb serait continuer au lieu de l'affecter à la variable c .

124voto

vaer-k Points 3623

En python3 ipdb (et pdb ) ont une commande appelée interagir . Il peut être utilisé pour :

Lancer un interprète interactif (en utilisant la fonction code ) dont l'espace de noms global contient tous les noms (globaux et locaux) trouvés dans le champ d'application actuel.

Pour l'utiliser, il suffit d'entrer interact à l'invite pdb. Elle est notamment utile pour appliquer du code sur plusieurs lignes et pour éviter le déclenchement accidentel d'autres commandes pdb.

54voto

fx-kirin Points 589

Je recommande d'utiliser l'intégration IPython.

ipdb> from IPython import embed; embed()

36voto

Garrett Hyde Points 2497

Dans l'interpréteur ou le débogueur Python (2.7.1) (import pdb), vous pouvez exécuter une instruction sur plusieurs lignes avec la syntaxe suivante.

for i in range(5): print("Hello"); print("World"); print(i)

Note : Lorsque je suis dans l'interpréteur, je dois appuyer deux fois sur return avant que le code ne s'exécute. Dans le débogueur, en revanche, je ne dois appuyer qu'une seule fois sur la touche return.

9 votes

Il ne permet pas de faire fonctionner quelque chose de plus profond qu'un seul niveau.

7voto

ThomasH Points 6597

Il existe un cas particulier où vous souhaitez que quelques commandes soient exécutées lorsque vous atteignez un point d'arrêt. Il y a ensuite la commande du débogueur commands . Elle vous permet d'entrer plusieurs lignes de commande et de terminer la séquence entière avec la touche end mot clé. Plus avec (pdb) help commands .

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