如何通过编程逐行执行/步进Python代码

3
我正在尝试找到一种方法,可以让程序逐行遍历Python代码,并对每行的结果进行处理。这实际上是一个可以通过编程控制而不是手动方式操作的调试器。如果pdb在每个步骤后返回其输出作为字符串并且我可以再次调用pdb来继续之前的调试进度,那么它将会是我所需要的。但是,它将输出到stdout并且我必须通过键盘手动输入"step"。
我尝试过以下几种方法:
  1. 我能够重定向pdb的stdout。我可以将其重定向到第二个Python程序中,然后再进行处理。但是,我无法弄清楚如何让第二个Python程序告诉pdb进行单步操作。
  2. 如果我能够让pdb一直执行到最后(也许我可以想出一些欺骗性的方式,反复模拟键盘输入"step"?),并将输出重定向到文件,然后我就可以编写另一个程序,在其读取文件的每一行时,就好像在逐行地遍历程序一样。
  3. 我可以使用exec手动运行Python代码的每一行。然而,由于我只能查看一行,因此我需要手动检测和处理条件语句、循环和函数调用等内容,这会很快变得非常复杂。
  4. 我阅读了一些帖子,说pdb是使用sys.settrace实现的。如果没有其他方法,我应该能够使用它来重新创建我需要的行为。
是否有任何已建立/直接的方法可以实现我所需要的行为?

你在下面说你已经解决了问题。你是通过模拟标准输入来逐步执行的,还是找到了类似pdb.do_step()这样的调用方式?能否详细说明一下你的解决方案? - Michael
2个回答

2

sys.settrace()是在Python代码中步进的基本构建块。pdb完全是用Python实现的,所以您可以查看该模块以了解其工作原理。它还具有各种公共函数/方法,可在程序控制下进行步进,请查阅您的Python版本的库参考以获取详细信息。


谢谢您的回复。我正在查看链接,但它描述的命令使用调试器提示而不是程序。我在链接中获取了pdb源代码,并尝试直接访问方法。调用run会打开调试器提示: myPdb = pdb.Pdb() myPdb.run(test)然而,我没有找到一种可以在没有提示的情况下步进的方法。 myPdb.do_step("test = "a = 10\nb=20\nprint a + b") 这并不起作用。您有任何建议吗?我该从哪里开始? - David Moneysmith
嘿,抱歉让你等这么久才接受你的答案;假期期间事情有些繁忙。我已经成功使用pdb使它正常工作了! - David Moneysmith

1

我看到一些帖子说pdb是使用sys.settrace实现的。 如果其他方法都无法解决,我应该能够使用这个来重新创建我需要的行为。

不要把它视为最后的手段。我认为这是你想要实现的最佳方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接