Risposte:
Sì! C'è un debugger Python chiamato pdb
solo per farlo!
Puoi avviare un programma Python pdb
usando pdb myscript.py
o python -m pdb myscript.py
.
Ci sono alcuni comandi che è possibile emettere, che sono documentati nella pdb
pagina.
Alcuni utili da ricordare sono:
b
: imposta un punto di interruzionec
: continua il debug fino a quando non raggiungi un punto di interruziones
: scorrere il codicen
: per passare alla riga di codice successival
: 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 stackd
: naviga verso il basso di una cornice dello stackp
: per stampare il valore di un'espressione nel contesto correnteSe 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.
pudb
è fantastico per questo. Inoltrepydev
pdb
non è uno strumento da riga di comando. Per usarlo, usa python -m pdb your_script.py
.
pdb
comando fa parte del python
pacchetto. In ogni caso, python -m <module>
sta diventando lo standard anche per altre cose del genere pip
, quindi è probabilmente meglio usarlo per impostazione predefinita.
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
Esegui la prossima istruzione ... con "n" (successivo)
Ripetendo l'ultimo comando di debug ... con INVIO
Abbandonare tutto ... con "q" (esci)
Stampa del valore delle variabili ... con "p" (stampa)
a) pa
Disattivazione del prompt (Pdb) ... con “c” (continua)
Vedere dove sei ... con "l" (elenco)
Entrare nelle subroutine ... con "s" (entrare)
Continuando ... ma fino alla fine della subroutine corrente ... con "r" (ritorno)
Assegna un nuovo valore
a) ! b = "B"
Imposta un punto di interruzione
a) rompere il numero di biancheria
b) nome funzione di interruzione
c) rompere il nome del file: biancheria
Breakpoint temporaneo
a) biancheria da letto
Breakpoint condizionale
a) rompere biancheria, condizione
Nota: ** Tutti questi comandi devono essere eseguiti da ** pdb
Per una conoscenza approfondita, consultare: -
https://pythonconquerstheuniverse.wordpress.com/2009/09/10/debugging-in-python/
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'.
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à pdb
e 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.
breakpoint
ero 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 :-)
ipdb aggiunge la funzionalità IPython a pdb, offrendo i seguenti miglioramenti ENORMI:
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 dd
poiché tutto è contenuto in un'unica riga.
context=21
aumenta 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é:
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 c
sia 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.
Al breakpoint()
giorno d'oggi esiste un metodo che sostituisce import pdb; pdb.set_trace()
.
Ha anche diverse nuove funzionalità , come possibili variabili di ambiente.
Se vuoi un IDE con debugger integrato, prova PyScripter .
https://wiki.python.org/moin/PythonDebuggingTools
pudb è un buon sostituto drop-in per pdb
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:
io.StringIO
e io.BytesIO
invece: demoÈ 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.
Visual Studio con PTVS potrebbe essere un'opzione per te: http://www.hanselman.com/blog/OneOfMicrosoftsBestKeptSecretsPythonToolsForVisualStudioPTVS.aspx
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.