【问题标题】:How to programmatically execute/step through Python code line by line如何以编程方式逐行执行/逐步执行 Python 代码
【发布时间】:2017-04-25 09:02:18
【问题描述】:

我正在尝试找到一种方法,可以让程序逐行遍历 Python 代码,并对每一行的结果做一些事情。实际上是一个可以通过编程而不是手动控制的调试器。如果 pdb 在每一步之后将其输出作为字符串返回,那么 pdb 将正是我正在寻找的内容,然后我可以再次调用 pdb 以从我离开的地方拾取。但是,它输出到标准输出,我必须通过键盘手动输入“步骤”。

我尝试过的事情:

  1. 我能够重定向 pdb 的标准输出。我可以将其重定向到第二个 然后将处理它的 Python 程序。然而,我不能 弄清楚如何让第二个 Python 程序告诉 pdb 步骤。

  2. 和上一个有关,如果我能让pdb一路步进 一直到最后(也许我可以想出一些东西来欺骗 键盘反复输入“步骤”?)并将输出重定向到 文件,然后我可以编写另一个程序,就像它一样 当程序实际上只是在阅读 逐行归档。

  3. 我可以使用 exec 手动运行 Python 代码行。然而, 因为我一次只看一条线,所以我需要 手动检测和处理条件、循环和 函数调用很快就会变得非常复杂。

  4. 我读过一些帖子说 pdb 是使用 sys.settrace。如果没有其他工作,我应该能够重新创建 我需要使用它的行为。

是否有任何既定/直接的方式来实现我正在寻找的行为?

【问题讨论】:

标签: python interpreter pdb


【解决方案1】:

sys.settrace() 是单步执行 Python 代码的基本构建块。 pdb 完全用 Python 实现,因此您只需查看模块即可了解它是如何工作的。它还具有用于在程序控制下单步执行的各种公共函数/方法,有关详细信息,请阅读您的 Python 版本的库参考。

【讨论】:

  • 感谢您的回复。我正在查看link,但它描述的命令使用调试器提示而不是程序。我在link 获得了 pdb 源代码,并且我一直在尝试直接访问这些方法。调用 run 会打开调试器提示: myPdb = pdb.Pdb() myPdb.run(test) 但是,我还没有找到在没有提示的情况下逐步执行的方法。 myPdb.do_step("test = "a = 10\nb=20\nprint a + b") 这不起作用。你对我应该从这里去哪里有什么建议吗?
  • 您好,很抱歉这么久才接受您的回答;假期让事情变得疯狂。我能够让它与 pdb 一起工作!
【解决方案2】:

我读过一些帖子说 pdb 是使用 sys.settrace 实现的。 如果没有其他工作,我应该能够重新创建我需要的行为 使用这个。

不要将此视为最后的手段。我认为这是您想要完成的最佳方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-23
    • 2014-01-02
    • 1970-01-01
    • 2012-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-30
    相关资源
    最近更新 更多