Un moyen plus simple de mettre des points d'arrêt PDB dans du code Python?

105

Juste une question de commodité. J'ai été un peu gâté par les débogueurs dans les IDE comme Visual Studio et XCode. Je trouve un peu maladroit d'avoir à taper import pdb; pdb.set_trace()pour définir un point d'arrêt (je préfère ne pas importer pdb en haut du fichier car je pourrais l'oublier et le laisser).

Existe-t-il un moyen plus simple de définir un point d'arrêt dans le code Python, aussi simple et discret que ce que vous voyez dans un IDE?

Joe
la source
Utilisez PyCharm. Comment pourrait-il être plus simple que de saisir une ligne de point d'arrêt, sauf pour une exécution à l'aide d'un IDE Python?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
Utilisez simplement python -m pdb <your_script>.py alors b <line_number>pour définir le point d'arrêt au numéro de ligne choisi (pas de parenthèses de fonction). Appuyez sur cpour continuer vers votre point d'arrêt. Vous pouvez voir tous vos points d'arrêt en utilisant la bcommande seule. Tapez helppour voir les autres commandes pdb disponibles lors du débogage.
arcseldon
1
Depuis Python 3.7, vous pouvez désormais utiliser la breakpoint()fonction intégrée . python.org/dev/peps/pep-0553
Daniel

Réponses:

117

Vous pouvez exécuter votre programme pdbdepuis la ligne de commande en exécutant

python -m pdb votre_script.py

Il se cassera sur la 1ère ligne, puis vous pourrez ajouter un point d'arrêt où vous le souhaitez dans votre code en utilisant la breakcommande, sa syntaxe est:

b (reak) [[nom de fichier:] lineno | fonction [, condition]]

Il est suffisamment flexible pour vous donner la possibilité d'ajouter un point d'arrêt n'importe où.

mdeous
la source
24
pour clarifier ce point, si je pdb.set_trace()vais dans le débogueur, utilise la lcommande (liste) et vois que je veux définir un point d'arrêt à la ligne 27, j'entrerai alors: b 27et le débogueur définirait un point d'arrêt à la ligne 27 (j'ai trouvé la documentation un peu difficile à comprendre, je voulais donc ajouter ce point de clarification).
benjaminmgross
9
De plus, si vous avez un objet xet que vous souhaitez vous arrêter lorsque sa méthode fest appelée, vous pouvez dire break x.f, et ensuite c(ontinue). Cela fonctionne même si l'objet se trouve dans un fichier inaccessible ou a été créé dynamiquement, par exemple en décrochant.
osa
2
Lors du débogage après un stacktrace, vous pouvez copier le chemin complet dans un module et ajouter le numéro de ligne commeb /data/users/me/project/env/local/lib/python2.7/site-packages/django/core/urlresolvers.py:596
valide
58

Vous pouvez utiliser:

from pdb import set_trace as bp

code
code
bp()
code
code
Apogentus
la source
je ne sais pas pourquoi l'aliasing superflous, mais ;-). Pour une raison quelconque, mon IDE / Editor (vscode) était une jument cet AM et ne cesse de le souligner. Voir votre commentaire m'a vraiment aidé. Passez une bonne journée!
MrMesees
Merci beaucoup!
amarré
Comment puis-je forcer l'importation set_traceuniquement lorsque j'utilise bp ()?
alper le
39

Dans vim, j'ai une macro configurée pour cela (dans mon fichier .vimrc):

map <silent> <leader>b oimport pdb; pdb.set_trace()<esc>
map <silent> <leader>B Oimport pdb; pdb.set_trace()<esc>

donc je peux simplement appuyer sur \ b (quand je ne suis pas en mode insertion) et il ajoute un point d'arrêt après la ligne actuelle, ou \ B (notez la majuscule) et il en met un avant la ligne actuelle.

qui semble bien fonctionner. La plupart des autres éditeurs de programmeurs «simples» (emacs, sublimetext, etc.) devraient avoir des moyens simples similaires de le faire.

Edit: j'ai en fait:

au FileType python map <silent> <leader>b oimport pdb; pdb.set_trace()<esc>
au FileType python map <silent> <leader>B Oimport pdb; pdb.set_trace()<esc>

ce qui ne l'allume que pour les fichiers source python. Vous pouvez très facilement ajouter des lignes similaires pour javascript ou tout autre langage que vous utilisez.

Mise à jour 2019 (Python 3.7+)

Python 3.7+ a maintenant le builtin breakpoint()qui peut remplacer le précédent import pdb; pdb.set_trace()dans vim. Cela fonctionne toujours de la même manière.

Daniel
la source
2
Belle solution, et la ligne ajoutée aura également l'indentation correcte si vous l'avez set autoindentdans votre fichier .vimrc .
Jealie
Oui, je ne peux pas comprendre pourquoi la plupart des distributions ne sont pas livrées avec set autoindent(et un tas d'autres options) en standard. L'une des premières choses que je fais avec un nouveau système est de tirer un meilleur vimrc ...
Daniel
1
Utilisez simplement un registre nommé vim! Enregistrez la ligne que vous voulez mettre en mémoire tampon 'd' (comme dans d ebug) en appuyant sur "dyyet chaque fois que vous en avez besoin, faites simplement "dpou "dP. Apprenez les registres vim ! Ils sont très utiles et sont toujours pris en charge!
polvoazul
comment ajouter: w après cela?
ji-ruh
En poussant un peu plus loin le concept de registre nommé, vous pouvez enregistrer une macro, effectuer les opérations nécessaires, puis arrêter la macro. Collez ensuite le contenu de la macro dans votre fichier vimrc. Par exemple, démarrez la macro avec qd, puis "dpcollez plus tard . Enfin, assignez vos instructions à un registre donc toujours rempli lors du chargement de vim. Exemple: let @d = 'oimport pdb; pdb.set_trace()k0:w' Maintenant, utilisez simplement @dchaque fois que vous voulez coller la ligne dans un fichier. Ce qui précède enregistre également le fichier. Mais vous devrez enregistrer le vôtre (plutôt que copier / coller ci-dessus) car des caractères spéciaux sont impliqués (pour échapper, etc.).
arcseldon
27

Si vous ne voulez pas définir manuellement des points d'arrêt à chaque fois que vous exécutez le programme (en Python 3.2+), par exemple, disons que vous voulez créer directement un point d'arrêt à la ligne 3 et y arrêter l'exécution:

python -m pdb -c "b 3" -c c your_script.py

Les informations suivantes peuvent vous aider:

Si un fichier .pdbrc existe dans le répertoire personnel de l'utilisateur ou dans le répertoire courant, il est lu et exécuté comme s'il avait été saisi à l'invite du débogueur. Ceci est particulièrement utile pour les alias. Si les deux fichiers existent, celui du répertoire de base est lu en premier et les alias qui y sont définis peuvent être remplacés par le fichier local.

Modifié dans la version 3.2: .pdbrc peut désormais contenir des commandes qui poursuivent le débogage, telles que continue ou next. Auparavant, ces commandes n'avaient aucun effet.

Nouveau dans la version 3.2: pdb.py accepte désormais une option -c qui exécute les commandes comme si elles étaient données dans un fichier .pdbrc, voir Commandes du débogueur.

AXO
la source
10

Voici comment vous utiliseriez pdb dans la ligne de commande sans rien implémenter dans votre code source (la documentation et les autres ressources en ligne ne font pas un bon travail pour expliquer cela à un programmeur qui n'a utilisé que des débogueurs visuels dans le passé):

Démarrez pdb en tapant ce qui suit dans une invite du shell:

python -m pdb 'python_script'

Cette commande initialise pdb et le débogueur pdb s'arrêtera à la première ligne de votre python_script et attendra une entrée de votre part:

(Pdb)

Il s'agit de l'interface de communication avec le débogueur. Maintenant, vous pouvez spécifier vos commandes ici. Contrairement à l'utilisation de boutons ou de raccourcis clavier dans les débogueurs visuels, vous utiliserez ici des commandes pour obtenir les mêmes résultats.

Vous pouvez aller à la ligne suivante de votre code par la commande "n" (suivant):

(Pdb) n

L'exécution d'un prochain afficherait le numéro de ligne et le code spécifique dans la source:

> python_script(line number)method name
-> current line in the source code

Vous pouvez définir un point d'arrêt en spécifiant un numéro de ligne dans votre code source.

(Pdb) b 50

Ici, le débogueur est défini pour interrompre à la ligne 50. S'il n'y a pas d'autres points d'arrêt, le point d'arrêt à la ligne 50 sera le premier et il pourrait être référencé par l'ID de point d'arrêt qui est 1 dans ce cas. Si vous ajoutez plus de points d'arrêt, ils obtiendront des identifiants séquentiellement (c'est-à-dire 2, 3, etc.)

Une fois qu'un point d'arrêt est défini, vous continuerez à exécuter votre programme jusqu'à ce que pdb atteigne le point d'arrêt comme suit:

(Pdb) c

Une fois que vous avez atteint un point d'arrêt, vous pouvez passer à la ligne suivante, avec la commande n comme décrit précédemment. Si vous souhaitez examiner les valeurs des variables, vous exécuterez la commande de paramètre comme suit:

(Pdb) p variable_name

Si vous n'avez plus besoin d'un point d'arrêt, vous pouvez l'effacer en passant l'id du point d'arrêt avec la commande clear:

(Pdb) clear 1

Enfin, lorsque vous avez terminé avec le débogueur, vous pouvez quitter l'exécution comme vous le feriez pour l'interpréteur de ligne de commande python.

(Pdb) exit()

J'espère que cela aidera n'importe qui à démarrer avec pdb. Voici une liste de commandes que vous pouvez utiliser avec le débogueur: pdb so question and answers

picmate 涅
la source
4

Vous pouvez utiliser un IDE qui prend en charge le débogage python, ou vous pouvez consulter l'excellent outil Winpdb. Qui fonctionne sur n'importe quelle plate-forme et fournit des fonctionnalités de débogage graphique à votre script python.

http://winpdb.org/

Glenjamin
la source
2

Vous pouvez utiliser:

  • aile ide
  • éclipse avec le plugin pydev
  • pycharms

Tous les éléments ci-dessus prennent en charge le débogage python à partir d'un IDE.

vvatsa
la source
0

Dans Atom, si les plugins Python sont installés, vous pouvez simplement taper ' pdb' et appuyer sur Entrée et l'extrait de code tapera import et trace pour vous.

Je suis habitué à cela maintenant que parfois je le tape juste même si je le modifie dans vim et attend que la liste déroulante apparaisse.

Simplex
la source
0

Une méthode sous-estimée consiste à définir directement le point d'arrêt dans pdb:

pdb> b torch/__init__:10

définira un point d'arrêt sur site-packages\torch\__init__.py:10

ensuite pdb> c s'arrêtera sur ce point d'arrêt.

Les éléments suivants sont également valables:

pdb> b d:\anaconda\lib\site-packages\torch\__init__.py:10
pdb> b torch\__init__.py:10
pdb> b d:\\anaconda\\lib\\site-packages\\torch\\__init__.py:10
pdb> b d:/anaconda/lib/site-packages/torch/__init__.py:10

Voir doc pour plus de détails.

Conseil de janvier
la source
0

Vous pouvez utiliser Vim avec le plugin Python-Mode ou Emacs avec Elpy plugin .

Ces plugins vous donnent des points d'arrêt avec des frappes faciles ( \ bdans Vim et C-c C-u bdans Emacs) ainsi que de nombreuses autres fonctionnalités des IDE lourds (pliage de code, refactoring, peluchage, etc.) - le tout dans un éditeur de texte léger basé sur un terminal.

Chris Abraham
la source
-1

Le moyen le plus simple d'exécuter le débogueur sur votre script est simplement

pdb your_script.py

L'exécution de pdb sur une ligne de commande Linux donne

usage: pdb.py scriptfile [arg] ...
timbo
la source
Comment installer pdb? Ou d'où?
kenorb