web-dev-qa-db-fra.com

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

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

import ipdb; ipdb.set_trace()

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

Maintenant, quand je vais au débogueur, je veux exécuter une instruction multiligne telle qu'une clause if ou une boucle for mais dès que je tape

if condition:

et appuyez sur la touche de retour, je reçois le message d'erreur *** 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 pour toujours exécuter une clause if ou une boucle for?

130
Mike

Vous pouvez le faire en même temps que pdb pour lancer une session interactive temporaire Python) 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 pdb habituelle.

Il suffit de ne pas appuyer sur Ctrl-C, cela mettra fin à la session entière de pdb.

234
Marius Gedminas

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

Démarrez un interpréteur interactif (à l'aide du module code ) dont l'espace de noms global contient tous les noms (globaux et locaux) trouvés dans l'étendue actuelle.

Pour l'utiliser, entrez simplement interact à l'invite de pdb. Entre autres choses, il est utile pour appliquer du code couvrant plusieurs lignes et éviter le déclenchement accidentel d'autres commandes pdb.

43
vaer-k

Dans l’interprète ou le débogueur Python (2.7.1) (import pdb), vous pouvez exécuter une instruction multiligne avec la syntaxe suivante.

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

Remarque: lorsque je suis dans l’interprète, je dois appuyer sur la touche Entrée deux fois pour que le code soit exécuté. Dans le débogueur, cependant, je n'ai qu'à appuyer sur retour une fois.

30
Garrett Hyde

Ma recommandation est d'utiliser l'incorporation IPython.

python
ipdb> from IPython import embed; embed()
28
fx-kirin

Il existe un cas particulier si vous souhaitez exécuter quelques commandes lorsque vous atteignez un point d'arrêt. Ensuite, il y a la commande de débogage commands. Il vous permet de saisir plusieurs lignes de commandes, puis de terminer la séquence entière avec le mot clé end. Plus avec (pdb) help commands.

7
ThomasH

Je ne sais pas si vous pouvez faire cela, ce serait une fonctionnalité intéressante pour ipdb. Vous pouvez bien sûr utiliser la compréhension de liste et exécuter des expressions simples à plusieurs lignes telles que:

if y == 3: print y; print y; print y;

Vous pouvez également écrire certaines fonctions au préalable pour faire tout ce que vous avez besoin de faire et qui prendrait normalement plusieurs lignes.

2
zeekay

Ecrivez votre code dans un éditeur de texte, puis collez-le dans le débogueur:

if True:
    print('a')

C'est une solution idiote, mais aussi sale et rapide. Cela fonctionne sur le terminal Linux, mais je ne sais pas si cela fonctionnera sur la console Windows.

0
bizi