2013-07-18 4 views
5

मैं सर्वर पर http अनुरोध करने की कोशिश कर रहा हूं और जिस सामग्री को वापस प्राप्त करता हूं उसकी जांच कर रहा हूं। हालांकि, जब मैं के साथ ipdb के साथ पोकिंग करने का प्रयास करता हूं, तो मुझे *** Oldest frame मिल रहा है और मैं उस ऑब्जेक्ट पर किसी भी फ़ंक्शन को चला नहीं सकता जिसे मैं चलाने में सक्षम होना चाहिए। यहाँ प्राप्त करने में कठिनाई के लिए क्या कर कोड के ब्लॉक, और ipdb उत्पादन होता है:ipdb में '*** सबसे पुराना फ्रेम' का अर्थ क्या है?

कोड ब्लॉक:

for acc in sp_lost: 
    url = 'http://www.uniprot.org/uniprot/?query=mnemonic%3a'+acc+'+active%3ayes&format=tab&columns=entry%20name' 
    u = urllib.request.urlopen(url) 
    ipdb.set_trace() 

ipdb उत्पादन:

ipdb> url 
'http://www.uniprot.org/uniprot/?query=mnemonic%3aSPATL_MOUSE+active%3ayes&format=tab&columns=entry%20name' 
ipdb> u 
*** Oldest frame 
ipdb> str(u) 
'<http.client.HTTPResponse object at 0xe58e2d0>' 
ipdb> type(u) 
<class 'http.client.HTTPResponse'> 
ipdb> u.url      
*** Oldest frame 
ipdb> u.url()   # <-- unable to run url() on object...? 
*** Oldest frame 
ipdb> 

क्या *** Oldest frame मतलब है, और मैं इस ऑब्जेक्ट को और अधिक उपयोगी कैसे प्राप्त कर सकता हूं कि मैं उचित कार्यों को चला सकता हूं?

उत्तर

10

u पीडीबी कमांड स्टैक फ्रेम को पार करने के लिए है। आप पहले से ही 'सबसे ऊपर' फ्रेम में हैं। help u आप इसके बारे में और जानकारी देगा:

u(p) 
Move the current frame one level up in the stack trace 
(to an older frame). 

आदेश बारीकी d(own) और w(here) से संबंधित है:

d(own) 
Move the current frame one level down in the stack trace 
(to a newer frame). 
w(here) 
Print a stack trace, with the most recent frame at the bottom. 
An arrow indicates the "current frame", which determines the 
context of most commands. 'bt' is an alias for this command. 

आप चर u मुद्रित करने के लिए चाहते हैं, उपसर्ग यह ! के साथ डीबग कमांड के रूप में डीबगर द्वारा व्याख्या नहीं किया गया है:

!u 
!u.url 

या का उपयोग print():

print(u) 
help pdb उत्पादन से

:

आदेश डिबगर को नहीं पहचानता है कि अजगर बयान माना जाता है और संदर्भ में क्रियान्वित कर रहे हैं कार्यक्रम डीबग किया गया है। पायथन विवरणों को विस्मयादिबोधक बिंदु ('!') के साथ भी उपसर्ग किया जा सकता है।

Oldest frame स्टैक में फ्रेम है जहां आपका प्रोग्राम शुरू हुआ; यह समय में सबसे पुराना है; Newest frame, स्टैक का दूसरा छोर है, जहां पाइथन कोड निष्पादित कर रहा है और निष्पादन का वर्तमान फ्रेम है, जहां पाइथन जारी रहेगा यदि आप c(ontinue) कमांड दबाते हैं।

एक पुनरावर्ती समारोह के साथ एक छोटी सी डेमो:

>>> def foo(): 
...  foo() 
... 
>>> import pdb 
>>> pdb.run('foo()') 
> <string>(1)<module>() 
(Pdb) s 
--Call-- 
> <stdin>(1)foo() 
(Pdb) s 
> <stdin>(2)foo() 
(Pdb) s 
--Call-- 
> <stdin>(1)foo() 
(Pdb) s 
> <stdin>(2)foo() 
(Pdb) s 
--Call-- 
> <stdin>(1)foo() 
(Pdb) w 
    /Users/mj/Development/Libraries/buildout.python/parts/opt/lib/python2.7/bdb.py(400)run() 
-> exec cmd in globals, locals 
    <string>(1)<module>() 
    <stdin>(2)foo() 
    <stdin>(2)foo() 
> <stdin>(1)foo() 
(Pdb) u 
> <stdin>(2)foo() 
(Pdb) u 
> <stdin>(2)foo() 
(Pdb) u 
> <string>(1)<module>() 
(Pdb) u 
> /Users/mj/Development/Libraries/buildout.python/parts/opt/lib/python2.7/bdb.py(400)run() 
-> exec cmd in globals, locals 
(Pdb) u 
*** Oldest frame 
+0

धन्यवाद श्री पीटर्स, हमेशा की तरह जानकारीपूर्ण और विस्तृत विवरण :) – Houdini

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