debugging 基于断点的Python与IPython交互调试

vs3odd8k  于 2022-11-14  发布在  Python
关注(0)|答案(7)|浏览(214)

假设我有一个IPython会话,我从该会话调用一些脚本:

> run my_script.py

有没有办法在my_script.py中引入一个断点,以便从IPython检查我的工作区?
我记得在以前的IPython版本中阅读过这样的内容:

from IPython.Debugger import Tracer;     

def my_function():
    x = 5
    Tracer()
    print 5;

但是子模块Debugger似乎不再可用。
假设我已经打开了一个IPython会话:如何在选择位置停止程序并使用IPython检查工作区
一般来说,我更喜欢不需要预先指定行号的解决方案,因为我希望对上面的Tracer()进行不止一次这样的调用,而不必跟踪它们所在的行号。

mxg2im7a

mxg2im7a1#

Tracer()仍然存在于ipython中的另一个模块中。

from IPython.core.debugger import Tracer

def my_function():
    x = 5
    Tracer()()
    print 5

请注意Tracer前后的附加调用括号

edit:对于IPython 6及更高版本的Traceris deprecated,因此应改用set_trace()

from IPython.core.debugger import set_trace

def my_function():
    x = 5
    set_trace()
    print 5
pcrecxhr

pcrecxhr2#

您可以执行它,并在指定的行设定中断点,方法如下:

run -d -b12 myscript

其中-b12在第12行设置断点。当您进入此行时,您将立即进入pdb,并且您需要输入c以执行到该断点。

lnxxn5zx

lnxxn5zx3#

这是使用set_trace()方法的版本,而不是已弃用的Tracer()方法。

from IPython.core.debugger import Pdb

def my_function():
    x = 5
    Pdb().set_trace()
    print 5
oxcyiej7

oxcyiej74#

在IPython shell中,您可以执行以下操作

from IPython.core.debugger import Pdb
pdb = Pdb()
pdb.runcall(my_function)

例如,在函数内部执行普通的pdb.set_trace()

bprjcwpo

bprjcwpo5#

我一直有同样的问题和最好的变通办法,我发现这是相当hackey是添加一行,将打破我的代码,像这样:

...
a = 1+2
STOP
...

然后当我运行代码时,它会被破坏,我可以使用%debug来检查。你也可以打开%pdb来检查代码破坏的地方,但是如果你不想每次都检查代码破坏的地方,这可能会很麻烦。我希望有一个更优雅的解决方案。

eeq64g8w

eeq64g8w6#

在Python 3(v3.7+)中,有一个新的breakpoint()函数,你可以修改它的行为,让它为你调用ipython的调试器。
基本上,您可以设置一个指向调试器函数的环境变量(如果不设置该变量,breakpoint()默认为调用pdb)。
要将breakpoint()设置为调用ipython的调试器,请按如下方式设置环境变量(在shell中):

# for bash/zsh users
export PYTHONBREAKPOINT='IPython.core.debugger.set_trace'
# powershell users
$env:PYTHONBREAKPOINT='IPython.core.debugger.set_trace'

(Note,显然,如果您想永久设置环境变量,则需要修改您的shell配置文件或系统首选项。)
您可以写入:

def my_function():
    x = 5
    breakpoint()
    print 5;

而且它会为你进入ipython的调试器,我认为这比导入from IPython.core.debugger import set_trace和调用set_trace()要方便得多。

ruarlubt

ruarlubt7#

I see a lot of options here, but maybe not the following simple option. Fire up ipython in the directory where my_script.py is. Turn the debugger on if you want the code to go into debug mode when it fails. Type %pdb .

In [1]: %pdb
Automatic pdb calling has been turned ON

Next type

In [2]: %run -d ./my_script.py
*** Blank or comment
*** Blank or comment
NOTE: Enter 'c' at the ipdb>  prompt to continue execution.
> c:\users\c81196\lgd\mortgages-1\nmb\lgd\run_lgd.py(2)<module>()
      1 # system imports
----> 2 from os.path import join

Now you can set a breakpoint where ever you want it. Type b 100 to have a breakpoint at line 100, or b whatever.py:102 to have a breakpoint at line 102 in whatever.py . For instance:

ipdb> b 100

Then continue to run, or continue.

ipdb> c

Once the code fails, or reaches the breakpoint you can start using the full power of the python debugger pdb .
Note that pdb also allows the setting of a breakpoint at a function.

b(reak) [([filename:]lineno | function) [, condition]]

So you do not necessarily need to use line numbers.

相关问题