76 votes

Comment regardez-vous une variable dans pdb

Je débogue un script python et je veux regarder une variable pour un changement (un peu comme vous pouvez regarder une adresse mémoire dans gdb). Y a-t-il un moyen de faire cela?

25voto

Michael Hoffman Points 8557

Ici est un hacky façon de le faire avec pdb. Ces commandes peuvent être mis dans votre ~/.pdbrc pour le chargement automatique chaque fois que vous utilisez 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"])

Cela ajoute deux commandes, nextwatch et stepwatch qui prennent chacun un nom de variable varname comme argument. Ils vont faire une copie de l'image actuelle de la variable locale pour varname, si possible, et de garder de l'exécution d' next ou step , respectivement, jusqu'à ce que le nom des points de changements.

Cela fonctionne dans Disponible 2.7.2, mais s'appuie sur quelques - pdb internes de sorte qu'il sera probablement casser ailleurs.

1voto

Donkopotamus Points 1284

Vous pouvez envisager d'utiliser un débogueur alternatif, tel que pydbgr ou son prédécesseur pydb

Ceux-ci implémentent une interface de style gdb, vous pouvez donc utiliser display

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X