什么'***最旧的帧'在ipdb中意味着什么?

时间:2013-07-18 15:39:19

标签: python python-3.x pdb ipdb

我正在尝试向服务器发出http请求并检查我收到的内容。但是,当我尝试用HTTPResponse object ipdb时,我不断得到*** Oldest frame,我无法运行我应该能够运行的对象上的任何函数。以下是用于获取的代码块和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意味着什么,以及如何让这个对象更有用,我可以运行相应的函数?

1 个答案:

答案 0 :(得分:10)

u是遍历堆栈帧的PDB命令。你已经处于“最上层”的框架中。 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输出:

  

调试器无法识别的命令被假定为Python   语句并在程序的上下文中执行   调试。 Python语句也可以使用感叹号作为前缀   点('!')。

Oldest frame是程序启动时堆栈中的框架;它是最古老的; Newest frame是堆栈的另一端,是Python执行代码的地方,也是当前的执行框架,如果你点击c(ontinue)命令,Python将继续运行。

带递归函数的小演示:

>>> 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