我可以在正在运行的Python程序中设置断点并进入交互终端吗?

31 投票
6 回答
29909 浏览
提问于 2025-04-16 16:19

我不太确定我问的问题是否可能,但因为Python是一个解释型语言,所以可能是可以的。我正在尝试对一个开源项目进行修改,但由于Python没有类型的概念,所以很难知道变量里存的是什么数据以及它们的作用。你不能仅仅查文档来了解变量的类型,因为你不能确定它到底是什么类型。我想进入终端,这样我就可以快速检查变量的类型和它们的作用,比如输入help(var)或者print(var)。我可以通过修改代码然后每次重新运行程序来做到这一点,但那样会慢很多。

假设我有一个程序:

def foo():
    a = 5
    my_debug_shell()
    print a

foo()

my_debug_shell是我想问的函数。它会让我进入Python解释器的'>>>'提示符,在那里我可以输入help(a),它会告诉我a是一个整数。然后我输入'a=7',再输入一些'继续'的命令,程序就会继续执行,打印出7,而不是5,因为我改变了它。

6 个回答

13

Python 3.7+ 版本新增了一种设置断点的简单方法。

breakpoint()

当你使用 breakpoint() 时,它会自动 import pdb 并调用 pdb.set_trace()

记得要加上括号 (),因为 breakpoint 是一个函数,不是一个关键字。

32

这里有一个不需要修改代码的解决方案:

python -m pdb prog.py <prog_args>
(pdb) b 3
Breakpoint 1 at prog.py:3
(pdb) c
...
(pdb) p a
5
(pdb) a=7
(pdb) ...

简单来说:

  • 在调试器的控制下启动你的程序
  • 在某一行代码上设置一个断点
  • 让程序运行到那个断点
  • 你会得到一个可以互动的提示,允许你做你想做的事情(输入'help'可以查看所有选项)
42

这是一个链接,指向Python的官方文档,专门介绍了一个叫做pdb的工具。pdb是Python的调试器,简单来说,它可以帮助你找出程序中出错的地方,让你更容易修复问题。

import pdb
pdb.set_trace()

撰写回答