2011-10-05 8 views
36

में एक चर कैसे देखते हैं मैं एक पायथन लिपि डिबग कर रहा हूं, और मैं एक बदलाव के लिए एक चर देखना चाहता हूं (जैसा कि आप जीडीबी में मेमोरी एड्रेस देख सकते हैं)। क्या इसे करने का कोई तरीका है?आप पीडीबी

+0

आप इसे [pudb] (https://pypi.python.org/pypi/pudb) में कर सकते हैं –

+0

@WayneWerner देखभाल को दिखाने या दस्तावेज़ों से जोड़ने का उत्तर जोड़ने के लिए? मैं स्पष्ट रूप से खोज रहा हूं कि इसे 'पुडब' में कैसे किया जाए लेकिन खाली हो रहा है ... –

+0

@ जेफविडमैन यह एक और सवाल होगा - मुझे यह पूछने पर बताएं :) –

उत्तर

22

pdb के साथ ऐसा करने के लिए वास्तव में एक हैकी तरीका है। हर बार जब आप pdb का उपयोग करते हैं तो स्वचालित रूप से लोड होने के लिए इन आदेशों को आपके ~/.pdbrc में रखा जा सकता है।

!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"]) 

यह दो आदेश, nextwatch और stepwatch जो प्रत्येक एक चर नाम लेते हैं एक तर्क के रूप VARNAME कहते हैं। यदि संभव हो तो वे varname के लिए मौजूदा फ्रेम के स्थानीय चर की एक उथली प्रतिलिपि बना देंगे, और next या step निष्पादित करते रहें, जब तक कि नाम बदलना न पड़े।

यह सीपीथॉन 2.7.2 में काम करता है लेकिन कुछ pdb आंतरिक पर निर्भर करता है, इसलिए यह शायद कहीं और तोड़ देगा।

+0

मैंने मैक्रोज़ को मेरी ~/.pdbrc फ़ाइल में कॉपी किया। हालांकि पीडीबी मुझे बताता है: NameError 'nextwatch' undefiened है। मैं इसे इस तरह गिरता हूं: "अगलीवॉच '(var) –

+0

मैं अजगर 3.5, मैक का उपयोग कर रहा हूं, और ऐसा लगता है कि' .pdbrc' काम नहीं कर रहा है। यहां तक ​​कि जब मैं उपरोक्त कोड को '(पीडीबी) में बदलता हूं:' पर्यावरण, जब मैं 'स्टेपवॉच' या 'अगलीवॉच' चलाएं, यह कहता है कि '__dict' और अन्य परिभाषित नहीं हैं। क्या आप पाइथन 3.5 के लिए अपना कोड अपडेट कर सकते हैं? धन्यवाद – Daniel

+0

जैसा कि बताया गया है, यह शायद पाइथन के कुछ अन्य संस्करणों में काम नहीं करेगा। आपका स्वागत है एक नया उत्तर के रूप में एक पायथन 3.5 संस्करण पोस्ट करने के लिए। –

16

जब आप ब्रेकपॉइंट पर मार रहे हैं तो एक चर देखने के लिए, आप commands कमांड का उपयोग कर सकते हैं। जैसे ब्रेकपॉइंट # 1 (canonical example from pdb doc) मारते समय some_variable प्रिंटिंग।

(Pdb) commands 1 
(com) print some_variable 
(com) end 
(Pdb) 
+0

यह शीर्ष उत्तर होना चाहिए। आसान, सीधा, आपको पीडीबी की एक साफ सुविधा सिखाता है - ब्रेकपॉइंट कमांड। –

+1

हालांकि यह उपयोगी हो सकता है, यह सीधे सवाल का जवाब नहीं देता है , जो चरों में परिवर्तनों के लिए देखना चाहता है, और फिर उन परिवर्तनों को तोड़ना, न केवल प्रीसेट ब्रेकपॉइंट्स पर एक चर की स्थिति को देखें। – kmantel

8

के लिए अजगर 3:

आप pdb

की display कार्यक्षमता का उपयोग एक बार जब आप ब्रेकप्वाइंट हिट कर सकते हैं बस टाइप

ipdb>प्रदर्शनअभिव्यक्ति

उदाहरण:

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> 

के रूप में आप देख सकते हैं, हर बार जब आप प्रदर्शन प्रकार - यह आपकी घड़ियों (भाव) के सभी प्रिंट होगा। आप कुछ घड़ी को हटाने के लिए अंडरप्ले फ़ंक्शन का उपयोग कर सकते हैं।

तुम भी पीपी अभिव्यक्ति अभिव्यक्ति (बहुत उपयोगी)

6

सम्भावित समाधान का उपयोग है prettyprint का उपयोग कर सकते pdb++:

pip install pdbpp 
फिर

"निशान" वस्तु आप के साथ देखना चाहते हैं डेकोरेटर @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 

यहाँ pdb Wil किसी भी फू-ऑब्जेक्ट पर bar विशेषता के किसी भी बदलाव पर एल ब्रेक करें।

चेतावनियां
केवल अंतर्निहित __setattr__ -method का आमंत्रण ब्रेकप्वाइंट ट्रिगर किया जाएगा।इसका मतलब है कि f.bar = 'XYZ' और setattr(f, 'XYZ') काम करेंगे, लेकिन bar -object जोड़ तोड़ ब्रेकप्वाइंट ट्रिगर नहीं करेगा:

f.bar = [] 
f.bar.append(7) # will NOT trigger breakpoint 

f.bar = 2 
f.bar += 5  # will trigger breakpoint 

नोट: @break_on_setattr मानक pdb मॉड्यूल का हिस्सा नहीं है। pdbpdbpp -package द्वारा ओवरराइड/बंदर-पैच किया गया है।

संबंधित मुद्दे