Come scorrere il codice Python per aiutare i problemi di debug?


186

In Java / C # è possibile scorrere facilmente il codice per rintracciare ciò che potrebbe andare storto e gli IDE rendono questo processo molto intuitivo.

Riesci a rintracciare il codice Python in modo simile?

Risposte:


264

Sì! C'è un debugger Python chiamato pdbsolo per farlo!

Puoi avviare un programma Python pdbusando pdb myscript.pyo python -m pdb myscript.py.

Ci sono alcuni comandi che è possibile emettere, che sono documentati nella pdbpagina.

Alcuni utili da ricordare sono:

  • b: imposta un punto di interruzione
  • c: continua il debug fino a quando non raggiungi un punto di interruzione
  • s: scorrere il codice
  • n: per passare alla riga di codice successiva
  • l: elenca il codice sorgente per il file corrente (impostazione predefinita: 11 righe inclusa la riga in esecuzione)
  • u: naviga verso l'alto in una cornice di stack
  • d: naviga verso il basso di una cornice dello stack
  • p: per stampare il valore di un'espressione nel contesto corrente

Se non si desidera utilizzare un debugger della riga di comando, alcuni IDE come Pydev , Wing IDE o PyCharm dispongono di un debugger GUI. Wing e PyCharm sono prodotti commerciali, ma Wing ha un'edizione "Personal" gratuita e PyCharm ha un'edizione community gratuita.


10
Wow, non riesco a credere di avere difficoltà a trovare un pdb grafico per Linux / Ubuntu. Mi sto perdendo qualcosa? Potrei dover cercare di creare un plugin SublimeText per questo.
ThorSummoner,

4
PyCharm è abbastanza buono come debugger grafico e la sua Community Edition è gratuita!
Pieter,

@ThorSummoner, pudbè fantastico per questo. Inoltrepydev
alpha_989

pdbnon è uno strumento da riga di comando. Per usarlo, usa python -m pdb your_script.py.
jdhao,

@jdhao Immagino che non sia standard, ma su Ubuntu il pdbcomando fa parte del pythonpacchetto. In ogni caso, python -m <module>sta diventando lo standard anche per altre cose del genere pip, quindi è probabilmente meglio usarlo per impostazione predefinita.
wjandrea,

55

Usando Python Interactive Debugger 'pdb'

Il primo passo è fare in modo che l'interprete Python entri nella modalità di debug.

A. Dalla riga di comando

Il modo più diretto, che parte dalla riga di comando, dell'interprete Python

$ python -m pdb scriptName.py
> .../pdb_script.py(7)<module>()
-> """
(Pdb)

B. All'interno dell'interprete

Durante lo sviluppo delle prime versioni dei moduli e per sperimentarlo in modo più iterativo.

$ python
Python 2.7 (r27:82508, Jul  3 2010, 21:12:11)
[GCC 4.0.1 (Apple Inc. build 5493)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import pdb_script
>>> import pdb
>>> pdb.run('pdb_script.MyObj(5).go()')
> <string>(1)<module>()
(Pdb)

C. Dall'interno del programma

Per un grande progetto e un modulo di lunga durata, puoi avviare il debug dall'interno del programma usando import pdb e set_trace () in questo modo:

#!/usr/bin/env python
# encoding: utf-8
#

import pdb

class MyObj(object):
    count = 5
    def __init__(self):
        self.count= 9

    def go(self):
        for i in range(self.count):
            pdb.set_trace()
            print i
        return

if __name__ == '__main__':
    MyObj(5).go()

Debug passo-passo per entrare in più interni

  1. Esegui la prossima istruzione ... con "n" (successivo)

  2. Ripetendo l'ultimo comando di debug ... con INVIO

  3. Abbandonare tutto ... con "q" (esci)

  4. Stampa del valore delle variabili ... con "p" (stampa)

    a) pa

  5. Disattivazione del prompt (Pdb) ... con “c” (continua)

  6. Vedere dove sei ... con "l" (elenco)

  7. Entrare nelle subroutine ... con "s" (entrare)

  8. Continuando ... ma fino alla fine della subroutine corrente ... con "r" (ritorno)

  9. Assegna un nuovo valore

    a) ! b = "B"

  10. Imposta un punto di interruzione

    a) rompere il numero di biancheria

    b) nome funzione di interruzione

    c) rompere il nome del file: biancheria

  11. Breakpoint temporaneo

    a) biancheria da letto

  12. Breakpoint condizionale

    a) rompere biancheria, condizione

Nota: ** Tutti questi comandi devono essere eseguiti da ** pdb

Per una conoscenza approfondita, consultare: -

https://pymotw.com/2/pdb/

https://pythonconquerstheuniverse.wordpress.com/2009/09/10/debugging-in-python/


41

C'è un modulo chiamato 'pdb' in Python. Nella parte superiore del tuo script Python lo fai

import pdb
pdb.set_trace()

e entrerai in modalità debug. Puoi usare 's' per passare, 'n' per seguire la riga successiva in modo simile a quello che faresti con il debugger 'gdb'.


21

A partire da Python 3.7, è possibile utilizzare la breakpoint()funzione integrata per inserire il debugger:

foo()
breakpoint()  # drop into the debugger at this point
bar()

Per impostazione predefinita, breakpoint()importerà pdbe chiamerà pdb.set_trace(). Tuttavia, è possibile controllare il comportamento del debug tramite sys.breakpointhook()e l'uso della variabile di ambiente PYTHONBREAKPOINT.

Vedere PEP 553 per ulteriori informazioni.


2
Quando ho visto breakpointero eccitato. Ma poi ho imparato che è essenzialmente solo una scorciatoia per import pdb; pdb.set_trace()e che mi ha reso triste. Sviluppatori Python: concentrati sul miglioramento del PDB con funzionalità GDB di base come linee di contesto, cronologia dei comandi persistenti e completamento automatico delle schede :-)
Ciro Santilli 21 冠状 病 六四 事件 法轮功

11

ipdb (debugger IPython)

ipdb aggiunge la funzionalità IPython a pdb, offrendo i seguenti miglioramenti ENORMI:

  • completamento della scheda
  • mostra più linee di contesto
  • evidenziazione della sintassi

Proprio come pdg, ipdb è ancora tutt'altro che perfetto e completamente rudimentale rispetto a GDB, ma è già un enorme miglioramento rispetto a pdb.

L'utilizzo è analogo a pdb, basta installarlo con:

python3 -m pip install --user ipdb

e quindi aggiungere alla riga da cui si desidera eseguire il debug:

__import__('ipdb').set_trace(context=21)

Probabilmente vuoi aggiungere una scorciatoia per quello dal tuo editor, ad es. Per Vim snipmate ho:

snippet ipd
    __import__('ipdb').set_trace(context=21)

così posso digitare giusto ipd<tab>e si espande al punto di interruzione. Quindi rimuoverlo è facile ddpoiché tutto è contenuto in un'unica riga.

context=21aumenta il numero di linee di contesto come spiegato in: Come posso fare in modo che ipdb mostri più linee di contesto durante il debug?

In alternativa, puoi anche eseguire il debug dei programmi dall'inizio con:

ipdb3 main.py

ma generalmente non vuoi farlo perché:

  • dovresti passare attraverso tutte le definizioni di funzioni e classi mentre Python legge quelle righe
  • Non so come impostare la dimensione del contesto lì senza hackerare ipdb. Patch per consentirlo: https://github.com/gotcha/ipdb/pull/155

O in alternativa, come in raw pdb 3.2+ è possibile impostare alcuni punti di interruzione dalla riga di comando:

ipdb3 -c 'b 12' -c 'b myfunc' ~/test/a.py

sebbene -c csia rotto per qualche ragione: https://github.com/gotcha/ipdb/issues/156

python -m moduleè stato chiesto il debug su: Come eseguire il debug di un modulo Python eseguito con python -m dalla riga di comando? e poiché Python 3.7 può essere fatto con:

python -m pdb -m my_module

Gravi funzionalità mancanti di pdb e ipdb rispetto a GDB:

fastidi specifici per ipdb:

Testato in Ubuntu 16.04, ipdb == 0.11, Python 3.5.2.



3

Se vieni da Java / C #, suppongo che la tua scommessa migliore sarebbe quella di usare Eclipse con Pydev . Questo ti dà un IDE perfettamente funzionante con debugger integrato. Lo uso anche con Django.




2

Python Tutor è un debugger online a singolo passaggio pensato per i principianti. È possibile inserire il codice nella pagina di modifica, quindi fare clic su "Visualizza esecuzione" per avviarlo in esecuzione.

Tra le altre cose, supporta:

Tuttavia, non supporta molte cose , ad esempio:

  • Lettura / scrittura di file: utilizzare io.StringIOe io.BytesIOinvece: demo
  • Codice troppo grande, troppo lungo o che definisce troppe variabili o oggetti
  • Argomenti della riga di comando
  • Molti moduli di libreria standard come argparse, csv, enum, html, os, struct, weakref ...

1

È possibile anche programmare e rintracciare programmaticamente il codice Python (ed è facile!). Guarda la documentazione di sys.settrace () per maggiori dettagli. Anche qui è un tutorial per iniziare.



1

PyCharm è un IDE per Python che include un debugger. Guarda questo video di YouTube per un'introduzione sull'uso del debugger di PyCharm per scorrere il codice.

PyCharm Tutorial - Debug del codice Python usando PyCharm

Nota: questo non intende essere un'approvazione o una revisione. PyCharm è un prodotto commerciale che bisogna pagare, ma l'azienda fornisce una licenza gratuita a studenti e insegnanti, nonché una versione comunitaria "leggera" che è gratuita e open-source.

Immagine dello schermo

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.