我可以在正在运行的Python程序中放置一个断点,该程序可以放到交互式终端吗?

sas*_*alm 26 python

我不确定我问的是否可能,但是因为python可能是一个解释器.我正在尝试在开源项目中进行更改,但因为python中没有类型,所以很难知道变量作为数据和它们的作用.您不能只查找var类型的文档,因为您无法确定它是什么类型.我想放到终端,这样我就可以通过输入help(var)或print(var)来快速检查变量的类型和它们的作用.我可以通过更改代码然后每次重新运行程序来执行此操作,但这会慢得多.

假设我有一个程序:

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

foo()
Run Code Online (Sandbox Code Playgroud)

my_debug_shell是我要问的函数.它会让我进入python解释器的'>>> shell,在那里我可以输入help(a),它会告诉我a是一个整数.然后我输入'a = 7'和一些'continue'命令,程序继续打印7而不是5,因为我改变了它.

Tho*_*asH 28

这是一个不需要更改代码的解决方案:

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) ...
Run Code Online (Sandbox Code Playgroud)

简而言之:

  • 在调试器控制下启动程序
  • 在给定的代码行设置一个断点
  • 让程序运行到那一点
  • 你得到一个交互式提示,让你做你想做的事情(为所有选项输入'help')

  • @David只需查看上面的代码示例:`python -m pdb ...`在调试器控制下启动程序,`b &lt;line number&gt;`设置断点。在调试器提示符处键入“help”以获取所有命令。 (2认同)

Eri*_*got 9

一个单行局部简单的办法就是把1/0你想要的断点:这将引发异常,这将是由调试器捕获.这种方法的两个优点是:

  • 以这种方式设置的断点对于代码修改是强健的(不依赖于特定的行号);

  • 一个人不需要import pdb在每个程序中进行调试; 可以在需要的地方直接插入"断点".

为了自动捕获异常,您可以简单地执行python -m pdb prog.py…然后键入c(ontinue)以启动程序.当1/0到达,程序退出,但变量可以被检查照常与pdb调试器(p my_var).现在,这不允许您修复问题并继续运行程序.相反,您可以尝试修复错误并再次运行程序.

如果你想使用强大的IPython shell,ipython -pdb prog.py…做同样的事情,但会导致IPython更好的调试器界面.或者,您可以在IPython shell中执行所有操作:

  • 在IPython中,设置IPython(%pdb)的"异常调试"模式.
  • 从IPython运行程序%run prog.py….发生异常时,调试器会自动激活,您可以检查变量等.

后一种方法的优点是(1)IPython shell几乎是必须的; (2)安装完成后,可以通过它轻松完成调试(而不是直接通过pdb模块).在完整的文档可从IPython的页面.


Rut*_*ins 6

Python3.7有一种新的内置断点方式。

breakpoint()
Run Code Online (Sandbox Code Playgroud)

执行breakpoint()willimport pdb和 call pdb.set_trace()

请记住包含大括号(),因为它breakpoint是一个函数,而不是关键字。