鑑於此示例代碼:如何繼續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