鉴于此示例代码:如何继续Python PDB中的下一个循环迭代?
import pdb
for i in range(10):
pdb.set_trace()
print(str(i))
当我从PDB提示,我怎么能跳过循环的迭代器,继续循环控制语句,当它也使用了PDB,继续代码执行?
鉴于此示例代码:如何继续Python PDB中的下一个循环迭代?
import pdb
for i in range(10):
pdb.set_trace()
print(str(i))
当我从PDB提示,我怎么能跳过循环的迭代器,继续循环控制语句,当它也使用了PDB,继续代码执行?
听起来像想要做的奇怪的事情。但你应该可以使用jump command。您可能需要在for循环的末尾添加一个pass语句,以便可以跳转到循环结尾。如果您不确定代码的行号,则可以使用ll
来查找循环的行号。
> c:\run.py(5)<module>()
-> print(i)
(Pdb) ll
1 import pdb
2
3 for i in range(10):
4 pdb.set_trace()
5 -> print(i)
6 pass
(Pdb) j 6
> c:\run.py(6)<module>()
-> pass
(Pdb) c
> c:\python\run.py(4)<module>()
-> pdb.set_trace()
(Pdb) c
1
> c:\python\run.py(5)<module>()
-> print(i)
值得注意的是,跳到for
行将重新启动循环。
这是一个解决方案。非常感谢你!虽然如果有人知道只是在上下文中执行* continue *语句的解决方案,它会更好。 – Andor 2015-02-09 16:53:36
您不能使用continue
,因为调试器中的新语句需要为完成并且没有任何其他上下文有效;当编译时,必须在循环结构内给出continue
。因此,即使调试器正在处理循环结构,也不能使用!continue
(使用!
来阻止pdb
解释该命令)。
可以使用j[ump]
命令,只要你有一个后声明跳转到。如果你的循环是空后,你想要的报表跳过去,你只能“倒带”:
$ bin/python test.py
> /.../test.py(5)<module>()
-> print(str(i))
(Pdb) l
1 import pdb
2
3 for i in range(10):
4 pdb.set_trace()
5 -> print(str(i))
6
[EOF]
(Pdb) j 3
> /.../test.py(3)<module>()
-> for i in range(10):
j 3
跃升至3行,不跳过任何东西;第3行将被重新执行,包括设置range()
。您可以跳转到第4行,但for
循环不会前进。
您需要在循环结尾添加另一条语句以跳转到Python以继续。该陈述可以是print()
或pass
或其他任何不必改变您的状态的内容。你甚至可以使用continue
作为最后的陈述。我用i
:
for i in range(10):
pdb.set_trace()
print(str(i))
i # only here to jump to.
演示:
$ bin/python test.py
> /.../test.py(5)<module>()
-> print(str(i))
(Pdb) l
1 import pdb
2
3 for i in range(10):
4 pdb.set_trace()
5 -> print(str(i))
6 i # only here to jump to.
7
[EOF]
(Pdb) j 6
> /.../test.py(6)<module>()
-> i # only here to jump to.
(Pdb) c
> /.../test.py(4)<module>()
-> pdb.set_trace()
(Pdb) s
> /.../test.py(5)<module>()
-> print(str(i))
(Pdb) j 6
> /.../test.py(6)<module>()
-> i # only here to jump to.
(Pdb) i
1
(Pdb) c
> /.../test.py(4)<module>()
-> pdb.set_trace()
(Pdb) s
> /.../test.py(5)<module>()
-> print(str(i))
(Pdb) j 6
> /.../test.py(6)<module>()
-> i # only here to jump to.
(Pdb) i
2
Ĵ(UMP)LINENO
设置将要执行的下一行。仅在最底部的框架中可用。这可以让您跳回来并再次执行代码,或者跳转到跳过您不想运行的代码。需要注意的是,并非所有跳转都是允许的 - 例如跳转到
for
循环的中间或finally
子句中不可跳转。
所以,很明显,你希望代码的行为就像是一个'continue'语句被执行了吗?你不想让str(i)'为那个循环打印,对吧? – Kevin 2015-02-09 16:30:24
这是正确的! – Andor 2015-02-09 16:35:55
顺便提一句,对于“如何区分pdb命令和Python表达式看起来像pdb命令?”的一般问题,您可以在Python表达式前加一个感叹号。但这似乎并不适用于“继续”。 – Kevin 2015-02-09 16:50:59