Sto debug di uno script python, e voglio vedere una variabile per un cambiamento (tanto come è possibile guardare un indirizzo di memoria in gdb). C'è un modo per fare questo?Come si guarda una variabile in PPB
risposta
Ecco un modo davvero hacky per fare questo con pdb
. Questi comandi possono essere inseriti nel tuo ~/.pdbrc
per il caricamento automatico ogni volta che usi pdb
.
!global __currentframe, __stack; from inspect import currentframe as __currentframe, stack as __stack
!global __copy; from copy import copy as __copy
!global __Pdb; from pdb import Pdb as __Pdb
!global __pdb; __pdb = [__framerec[0].f_locals.get("pdb") or __framerec[0].f_locals.get("self") for __framerec in __stack() if (__framerec[0].f_locals.get("pdb") or __framerec[0].f_locals.get("self")).__class__ == __Pdb][-1]
alias _setup_watchpoint !global __key, __dict, __val; __key = '%1'; __dict = __currentframe().f_locals if __currentframe().f_locals.has_key(__key) else __currentframe().f_globals; __val = __copy(%1)
alias _nextwatch_internal next;; !if __dict[__key] == __val: __pdb.cmdqueue.append("_nextwatch_internal %1")
alias _stepwatch_internal step;; !if __dict[__key] == __val: __pdb.cmdqueue.append("_stepwatch_internal %1")
alias nextwatch __pdb.cmdqueue.extend(["_setup_watchpoint %1", "_nextwatch_internal"])
alias stepwatch __pdb.cmdqueue.extend(["_setup_watchpoint %1", "_stepwatch_internal"])
Questo aggiunge due comandi, nextwatch
e stepwatch
cui ciascun prendono un nome variabile varname come argomento. Faranno una copia dei variabile locale del frame corrente varname se possibile, e mantenere esecuzione next
o step
rispettivamente fino a che tale nome indica modifiche.
Questo funziona in CPython 2.7.2 ma si basa su alcuni interni pdb
, quindi si romperà probabilmente altrove.
Ho copiato le macro nel mio file ~/.pdbrc. Comunque pdb mi dice: NameError 'nextwatch' non è stato risolto. Lo faccio cadere così: "nextwatch '(var) –
Io uso python 3.5, mac, e sembra che' .pdbrc' non funzioni Anche quando incollo il codice sopra in '(pdb):' environment, quando I esegui 'stepwatch' o' nextwatch', dice '__dict' e altri non sono definiti.Potresti aggiornare il tuo codice per python 3.5? grazie – Daniel
Come accennato, questo probabilmente non funzionerà in alcune altre versioni di Python. per pubblicare una versione di Python 3.5 come nuova risposta –
Per la visualizzazione di una variabile quando si colpisce un punto di interruzione , è possibile utilizzare il comando commands
. Per esempio. stampa some_variable
quando si colpisce il punto di interruzione n. 1 (canonical example from pdb
doc).
(Pdb) commands 1
(com) print some_variable
(com) end
(Pdb)
Questa dovrebbe essere la risposta migliore: semplice, diretta, ti insegna una funzione precisa di pdb - i comandi di breakpoint –
Mentre può essere utile, non risponde direttamente alla domanda , che desidera controllare le modifiche alle variabili e quindi interromperle, non solo visualizzare lo stato di una variabile nei punti di interruzione preimpostati. – kmantel
Per Python 3:
è possibile utilizzare display funzionalità del PPB
Una volta raggiunto il punto di interruzione è sufficiente digitare
IPDB>visualizzazioneespressione
esempio:
ipdb> display instance
display instance: <AppUser: dmitry4>
ipdb> display instance.id
display instance.id: 9
ipdb> display instance.university
display instance.university: <University: @domain.com>
ipdb> display
Currently displaying:
instance.university: <University: @domain.com>
instance.id: 9
instance: <AppUser: dmitry4>
ipdb>
come si può vedere, ogni volta che si digita display - stamperà tutti i tuoi orologi (espressioni). È possibile utilizzare la funzione di visualizzazione per rimuovere determinati orologi.
È inoltre possibile utilizzare pp espressione al prettyprint l'espressione (molto utile)
Una possibile soluzione è quella di utilizzare pdb++:
pip install pdbpp
Poi "marchio" l'oggetto che si desidera guardare con il decoratore @pdb.break_on_setattr
:
from pdb import break_on_setattr
@break_on_setattr('bar')
class Foo(object):
pass
f = Foo()
f.bar = 42 # the program breaks here
Qui pdb
wil interrompo qualsiasi modifica dell'attributo bar
su qualsiasi oggetto Foo.
Avvertenze
Solo invocazioni del sottostante __setattr__
-Metodo attiverà il punto di interruzione.Ciò significa che f.bar = 'XYZ'
e setattr(f, 'XYZ')
funzionerà, ma la manipolazione del bar
-oggetto non attivano il punto di interruzione:
f.bar = []
f.bar.append(7) # will NOT trigger breakpoint
f.bar = 2
f.bar += 5 # will trigger breakpoint
Nota: @break_on_setattr
non è parte dello standard pdb
-module. pdb
è sovrascritto/scimmia-patchato dal pacchetto pdbpp
.
- 1. java debugging - guarda una variabile fuori ambito
- 2. Guarda per un cambiamento variabile in python
- 3. Striscia il percorso dei PPB
- 4. Come nascondere il righello quando si guarda l'elemento in chrome?
- 5. In elisp, come si inserisce una funzione in una variabile?
- 6. Azure WebJob guarda l'app.config una volta distribuito
- 7. Come si usa una variabile come modificatore regex in perl?
- 8. Inline Se in Razor Guarda
- 9. Come si esegue il dump di una variabile in JSP?
- 10. Come si dichiara una variabile globale in VBA?
- 11. Come si usa una variabile in lib Path?
- 12. Come si crea una variabile fittizia in R?
- 13. Come si imposta una variabile "ENV" in EmberJS?
- 14. Bash come si acquisisce lo stderr in una variabile?
- 15. Come si immette una variabile nell'ambito di una direttiva?
- 16. Come si chiama una funzione attraverso una variabile membro?
- 17. Guarda la lunghezza NSString nel debugger
- 18. Come grunt guarda i file nelle sottocartelle?
- 19. Guarda un intervallo di memoria in gdb?
- 20. Come evitare che un monitor dorme mentre si guarda l'animazione in html 5
- 21. Come si memorizza un risultato in una variabile e si controlla il risultato in modo condizionale?
- 22. Che cosa significa quando si ha una variabile come l'accesso a $ 002 in Java?
- 23. Step into dll non è possibile (PPB disponibili)
- 24. Redis GUARDA MULTI EXEC da un client
- 25. Come "cancellare" una variabile dall'oscilloscopio in angular.js
- 26. Come si crea in modo esplicito una copia di una variabile in PHP?
- 27. Come si dichiara una variabile personalizzata all'interno del make target?
- 28. Come si seleziona uno schema basato su una variabile?
- 29. Come si controlla il tipo di una variabile locale?
- 30. Come si crea una variabile di istanza BOOL nell'obiettivo c?
Puoi farlo in [pudb] (https://pypi.python.org/pypi/pudb) –
@WayneWerner cura di aggiungere una risposta che mostra questo o il collegamento ai documenti? Sto cercando esplicitamente come farlo in 'pudb', ma è vuoto ... –
@JeffWidman Sarebbe un'altra domanda - fammi sapere quando lo chiedi :) –