Un modo più semplice per inserire i punti di interruzione PDB nel codice Python?


105

Solo una domanda di convenienza. Sono stato un po 'viziato con i debugger in IDE come Visual Studio e XCode. Trovo un po 'goffo dover digitare import pdb; pdb.set_trace()per impostare un punto di interruzione (preferirei non importare pdb all'inizio del file perché potrei dimenticarlo e lasciarlo dentro).

Esiste un modo più semplice per impostare un punto di interruzione nel codice Python, semplice e discreto come quello che vedi in un IDE?


Usa PyCharm. Come potrebbe essere più semplice che inserire una riga del punto di interruzione, tranne che per l'esecuzione utilizzando un IDE Python?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Basta usare python -m pdb <your_script>.py quindi b <line_number>per impostare il punto di interruzione al numero di riga scelto (nessuna parentesi di funzione). Premi cper continuare fino al punto di interruzione. Puoi vedere tutti i tuoi punti di interruzione usando il bcomando da solo. Digita helpper vedere altri comandi pdb disponibili durante il debug.
arcseldon

1
A partire da Python 3.7, ora puoi usare la breakpoint()funzione incorporata . python.org/dev/peps/pep-0553
Daniel

Risposte:


117

È possibile eseguire il programma in pdbdalla riga di comando eseguendo

python -m pdb tuo_script.py

Si interromperà sulla prima riga, quindi sarai in grado di aggiungere un punto di interruzione dove vuoi nel tuo codice usando il breakcomando, la sua sintassi è:

b (reak) [[nomefile:] lineno | funzione [, condizione]]

È abbastanza flessibile da darti la possibilità di aggiungere un punto di interruzione ovunque.


24
per chiarire questo punto, se pdb.set_trace()vado nel debugger, uso il lcomando (list) e vedo che voglio impostare un punto di interruzione alla riga 27, dovrei quindi inserire: b 27e il debugger imposterebbe un punto di interruzione alla riga 27 (ho trovato la documentazione un po 'difficile da capire, quindi ho voluto aggiungere quel punto di chiarimento).
benjaminmgross

9
Inoltre, se hai un oggetto xe vuoi fermarti quando fviene chiamato il suo metodo , puoi dire break x.f, e poi c(ontinue). Funziona anche se l'oggetto si trova in un file inaccessibile o è stato creato dinamicamente, ad esempio deselezionando.
osa

2
Durante il debug dopo uno stacktrace puoi copiare il percorso completo in un modulo e aggiungere il numero di riga comeb /data/users/me/project/env/local/lib/python2.7/site-packages/django/core/urlresolvers.py:596
valido

58

Puoi usare:

from pdb import set_trace as bp

code
code
bp()
code
code

non so perché l'aliasing superflous, ma ;-). Per qualche ragione il mio IDE / Editor (vscode) era una cavalla questa mattina e continua a sottolineare. Vedere il tuo commento mi ha davvero aiutato. Vi auguro una buona giornata!
MrMesees

Grazie mille!
ormeggia il

Come posso forzare l'importazione set_tracesolo quando uso bp ()?
alper

39

In vim, ho una macro impostata per questo (nel mio file .vimrc):

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

quindi posso semplicemente premere \ b (quando non è in modalità di inserimento) e aggiunge un punto di interruzione dopo la riga corrente, o \ B (nota la maiuscola) e ne mette uno prima della riga corrente.

che sembra funzionare bene. La maggior parte degli altri editor di programmatori "semplici" (emacs, sublimetext, ecc.) Dovrebbero avere modi semplici per farlo.

Modifica: in realtà ho:

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>

che lo attiva solo per i file sorgente python. Potresti facilmente aggiungere righe simili per javascript o qualsiasi altra lingua che usi.

Aggiornamento 2019 (Python 3.7+)

Python 3.7+ ora ha il builtin breakpoint()che può sostituire il precedente import pdb; pdb.set_trace()in vim. Funziona ancora allo stesso modo.


2
Bella soluzione, e anche la riga aggiunta avrà il rientro corretto se lo hai set autoindentnel tuo file .vimrc .
Jealie

Sì, non riesco a capire perché la maggior parte delle distribuzioni non vengono fornite con set autoindent(e un sacco di altre opzioni) come standard. Una delle prime cose che faccio con un nuovo sistema è inserire un vimrc migliore ...
Daniel

1
Basta usare un registro con nome vim! Salvare la riga che si desidera memorizzare nel buffer 'd' (come in d ebug) premendo "dyye ogni volta che ne hai bisogno basta fare "dpo "dP. Impara i registri di vim ! Sono molto utili e sono sempre supportati!
polvoazul

come aggiungere: w dopo?
ji-ruh

Portando un po 'oltre il concetto di registro denominato, è possibile registrare una macro, eseguire le operazioni necessarie e quindi interrompere la macro. Quindi incolla il contenuto della macro nel tuo file vimrc. Ad esempio, avvia la macro con qd, quindi in seguito "dpper incollare. Infine assegna le tue istruzioni a un registro quindi sempre popolato al caricamento di vim. Esempio: let @d = 'oimport pdb; pdb.set_trace()k0:w' ora, usa @dogni volta che vuoi incollare la riga in un file. Quanto sopra salva anche il file. Ma dovrai registrare il tuo (piuttosto che copiare / incollare sopra) poiché sono coinvolti caratteri speciali (per la fuga, ecc.).
arcseldon

27

Se non si desidera impostare manualmente i punti di interruzione ogni volta che si esegue il programma (in Python 3.2+), ad esempio si supponga di voler creare direttamente un punto di interruzione alla riga 3 e interrompere l'esecuzione lì:

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

Le seguenti informazioni possono aiutare:

Se un file .pdbrc esiste nella directory home dell'utente o nella directory corrente, viene letto ed eseguito come se fosse stato digitato al prompt del debugger. Ciò è particolarmente utile per gli alias. Se esistono entrambi i file, quello nella directory home viene letto per primo e gli alias ivi definiti possono essere sovrascritti dal file locale.

Modificato nella versione 3.2: .pdbrc ora può contenere comandi che continuano il debug, come continue o next. In precedenza, questi comandi non avevano alcun effetto.

Novità nella versione 3.2: pdb.py ora accetta un'opzione -c che esegue i comandi come se fossero dati in un file .pdbrc, vedere Comandi del debugger.



10

Questo è il modo in cui useresti pdb nella riga di comando senza implementare nulla nel tuo codice sorgente (la documentazione e altre risorse online non fanno un buon lavoro spiegandolo a un programmatore che ha utilizzato solo debugger visivi in ​​passato):

Avviare pdb digitando quanto segue in un prompt della shell:

python -m pdb 'python_script'

Questo comando inizializza pdb e il debugger pdb si interromperà alla prima riga del tuo python_script e attenderà un tuo input:

(Pdb)

Questa è l'interfaccia per comunicare con il debugger. Ora puoi specificare i tuoi comandi qui. Al contrario di utilizzare pulsanti o scorciatoie da tastiera nei debugger visivi, qui utilizzerai i comandi per ottenere gli stessi risultati.

Puoi passare alla riga successiva del codice con il comando "n" (successivo):

(Pdb) n

L'esecuzione di un successivo visualizzerà il numero di riga e il codice specifico nella sorgente:

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

È possibile impostare un punto di interruzione specificando un numero di riga nel codice sorgente.

(Pdb) b 50

Qui, il debugger è impostato per interrompere alla riga 50. Se non ci sono altri punti di interruzione, il punto di interruzione alla riga 50 sarà il primo e potrebbe essere referenziato dall'id del punto di interruzione che è 1 in questo caso. Se aggiungi più punti di interruzione, otterranno gli identificatori in sequenza (ad esempio, 2, 3 ecc.)

Una volta impostato un punto di interruzione, continuerai a eseguire il programma finché pdb non arriva al punto di interruzione come segue:

(Pdb) c

Una volta raggiunto un punto di interruzione, è possibile passare alla riga successiva, con il comando n come descritto in precedenza. Se vuoi esaminare i valori delle variabili, devi eseguire il comando del parametro come segue:

(Pdb) p variable_name

Se non hai più bisogno di un breakpoint, puoi cancellarlo passando l'id del breakpoint con il comando clear:

(Pdb) clear 1

Infine, quando hai finito con il debugger puoi uscire dall'esecuzione come faresti per uscire dall'interprete della riga di comando python.

(Pdb) exit()

Spero che questo aiuti chiunque a iniziare con pdb. Ecco un elenco di comandi che puoi usare con il debugger: pdb quindi domande e risposte



4

Puoi usare un IDE che supporta il debug di Python, oppure puoi controllare l'eccellente strumento Winpdb. Che funziona su qualsiasi piattaforma e fornisce funzionalità grafiche di debug al tuo script Python.

http://winpdb.org/


2

Puoi usare:

  • ala ide
  • eclissi con il plugin pydev
  • pycharms

Tutto quanto sopra supporta il debug di Python dall'interno di un IDE.


0

In Atom se sono installati plug-in Python, puoi semplicemente digitare 'pdb ' e premere invio e lo snippet digiterà import e trace per te.

Ci sono abituato ora che a volte lo digito anche se lo sto modificando in vim e aspetto che venga visualizzato il menu a discesa.


0

Un metodo sottovalutato consiste nell'impostare direttamente il punto di interruzione in pdb:

pdb> b torch/__init__:10

imposterà un punto di interruzione site-packages\torch\__init__.py:10

Quindi pdb> csi fermerà su questo punto di interruzione.

Valgono anche i seguenti:

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

Vedere il documento per i dettagli.


0

Puoi usare Vim con il plugin Python-Mode o Emacs con il plugin Elpy .

Questi plugin offrono punti di interruzione con semplici sequenze di tasti ( \ bin Vim e C-c C-u bin Emacs) oltre a molte altre funzionalità di IDE pesanti (piegatura del codice, refactoring, linting, ecc.) - Tutto all'interno di un editor di testo basato su terminale leggero.


-1

Il modo più semplice per eseguire il debugger sul tuo script è semplicemente

pdb your_script.py

L'esecuzione di pdb su una riga di comando Linux dà

usage: pdb.py scriptfile [arg] ...

Come si installa pdb? O da dove?
kenorb
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.