Python 如何在源代码中设置pdb中断条件?

Python 如何在源代码中设置pdb中断条件?,python,pdb,Python,Pdb,问题:如果我有一个复杂的断点条件,我不希望必须pdb。设置_trace()然后在每次重新启动程序时手动粘贴断点命令 有没有办法在我的源代码中设置断点 我尝试的内容:我阅读了文档并尝试插入这一行: pdb.run('break 445, a == 1') 但我在执行过程中遇到了一个错误: pdb.run('break 445, a == 1') File "C:\Python25\lib\pdb.py", line 1123, in run Pdb().run(stateme

问题:如果我有一个复杂的断点条件,我不希望必须
pdb。设置_trace()
然后在每次重新启动程序时手动粘贴断点命令

有没有办法在我的源代码中设置断点

我尝试的内容:我阅读了文档并尝试插入这一行:

pdb.run('break 445, a == 1')
但我在执行过程中遇到了一个错误:

    pdb.run('break 445, a == 1')
  File "C:\Python25\lib\pdb.py", line 1123, in run
    Pdb().run(statement, globals, locals)
  File "C:\Python25\lib\bdb.py", line 366, in run
    exec cmd in globals, locals
  File "<string>", line 1
    break 445, a == 1
            ^
SyntaxError: invalid syntax
pdb.run('break 445,a==1')
文件“C:\Python25\lib\pdb.py”,第1123行,正在运行
Pdb().run(语句、全局、局部)
文件“C:\Python25\lib\bdb.py”,第366行,正在运行
全局、局部中的exec cmd
文件“”,第1行
断开445,a==1
^
SyntaxError:无效语法

pdb
无法执行此操作。但是你可以自己构建它,在你自己的程序中,有几种方法

第一种方法是简单地用一个全局变量关闭断点条目。像这样的事情很简单(简单的例子):

第一次通过时,字典中不会有它,因此您将添加它并停止。但是,您可以更改字典中的值,然后检查是否应该首先停止,而不是实际停止。您可以使用
eval
等来执行更复杂的条件,但像上面这样做可能更容易。这是相当轻量级的,让你完全控制事情何时停止。唯一的一件事是,如果您将某项设置为
False
,那么在重新启动调试会话时,您必须记住自己初始化dict(通常清除它)。它没有集成到调试器中,但成本也不高

还有一件事要记住。。。在使用调试器之前,您没有要控制的调试器。这意味着,除非您首先执行
pdb.run()
,否则您实际上不在调试器中,并且(据我所知)无法在不停止的情况下进入调试器。但是,一旦进入调试器,就可以使用堆栈以某种巧妙的方式获取pdb对象。这是在IPython中,不幸的是,实际堆栈深度可能会根据您使用的pdb等不同而有所不同,但是您可以尝试以下方法来获取对当前运行的pdb对象的引用。一旦有了它,就可以使用它的接口直接与之交互。例如:

In [331]: %debug pass
NOTE: Enter 'c' at the ipdb>  prompt to continue execution.
None
> <string>(1)<module>()

ipdb> import inspect
ipdb> f = inspect.stack()[6]
ipdb> f0 = f[0]
ipdb> myipdb = f0.f_locals['self']
ipdb> myipdb.
myipdb.aliases               myipdb.dispatch_exception    myipdb.do_next               myipdb.fncache               myipdb.help_help             myipdb.lastcmd               myipdb.runctx
myipdb.botframe              myipdb.dispatch_line         myipdb.do_p                  myipdb.forget                myipdb.help_ignore           myipdb.lineinfo              myipdb.runeval
myipdb.bp_commands           myipdb.dispatch_return       myipdb.do_pdef               myipdb.format_stack_entry    myipdb.help_j                myipdb.lineno                myipdb.set_break
myipdb.break_anywhere        myipdb.displayhook           myipdb.do_pdoc               myipdb.get_all_breaks        myipdb.help_jump             myipdb.list_command_pydb     myipdb.set_colors
myipdb.break_here            myipdb.do_EOF                myipdb.do_pfile              myipdb.get_break             myipdb.help_l                myipdb.lookupmodule          myipdb.set_continue
myipdb.breaks                myipdb.do_a                  myipdb.do_pinfo              myipdb.get_breaks            myipdb.help_list             myipdb.mainpyfile            myipdb.set_next
myipdb.canonic               myipdb.do_alias              myipdb.do_pinfo2             myipdb.get_file_breaks       myipdb.help_n                myipdb.misc_header           myipdb.set_quit
myipdb.checkline             myipdb.do_args               myipdb.do_pp                 myipdb.get_names             myipdb.help_next             myipdb.new_do_down           myipdb.set_return
myipdb.clear_all_breaks      myipdb.do_b                  myipdb.do_psource            myipdb.get_stack             myipdb.help_p                myipdb.new_do_frame          myipdb.set_step
myipdb.clear_all_file_breaks myipdb.do_break              myipdb.do_q                  myipdb.handle_command_def    myipdb.help_pdb              myipdb.new_do_quit           myipdb.set_trace
myipdb.clear_bpbynumber      myipdb.do_bt                 myipdb.do_quit               myipdb.help_EOF              myipdb.help_pp               myipdb.new_do_restart        myipdb.set_until
myipdb.clear_break           myipdb.do_c                  myipdb.do_r                  myipdb.help_a                myipdb.help_q                myipdb.new_do_up             myipdb.setup
myipdb.cmdloop               myipdb.do_cl                 myipdb.do_restart            myipdb.help_alias            myipdb.help_quit             myipdb.nohelp                myipdb.shell
myipdb.cmdqueue              myipdb.do_clear              myipdb.do_return             myipdb.help_args             myipdb.help_r                myipdb.onecmd                myipdb.stack
myipdb.color_scheme_table    myipdb.do_commands           myipdb.do_retval             myipdb.help_b                myipdb.help_restart          myipdb.parseline             myipdb.stdin
myipdb.columnize             myipdb.do_condition          myipdb.do_run                myipdb.help_break            myipdb.help_return           myipdb.parser                myipdb.stdout
myipdb.commands              myipdb.do_cont               myipdb.do_rv                 myipdb.help_bt               myipdb.help_run              myipdb.postcmd               myipdb.stop_here
myipdb.commands_bnum         myipdb.do_continue           myipdb.do_s                  myipdb.help_c                myipdb.help_s                myipdb.postloop              myipdb.stopframe
myipdb.commands_defining     myipdb.do_d                  myipdb.do_step               myipdb.help_cl               myipdb.help_step             myipdb.precmd                myipdb.stoplineno
myipdb.commands_doprompt     myipdb.do_debug              myipdb.do_tbreak             myipdb.help_clear            myipdb.help_tbreak           myipdb.preloop               myipdb.trace_dispatch
myipdb.commands_resuming     myipdb.do_disable            myipdb.do_u                  myipdb.help_commands         myipdb.help_u                myipdb.print_list_lines      myipdb.undoc_header
myipdb.commands_silent       myipdb.do_down               myipdb.do_unalias            myipdb.help_condition        myipdb.help_unalias          myipdb.print_stack_entry     myipdb.use_rawinput
myipdb.complete              myipdb.do_enable             myipdb.do_unt                myipdb.help_cont             myipdb.help_unt              myipdb.print_stack_trace     myipdb.user_call
myipdb.complete_help         myipdb.do_exit               myipdb.do_until              myipdb.help_continue         myipdb.help_until            myipdb.print_topics          myipdb.user_exception
myipdb.completedefault       myipdb.do_h                  myipdb.do_up                 myipdb.help_d                myipdb.help_up               myipdb.prompt                myipdb.user_line
myipdb.completekey           myipdb.do_help               myipdb.do_w                  myipdb.help_debug            myipdb.help_w                myipdb.quitting              myipdb.user_return
myipdb.completenames         myipdb.do_ignore             myipdb.do_whatis             myipdb.help_disable          myipdb.help_whatis           myipdb.rcLines
myipdb.curframe              myipdb.do_j                  myipdb.do_where              myipdb.help_down             myipdb.help_where            myipdb.reset
myipdb.curindex              myipdb.do_jump               myipdb.doc_header            myipdb.help_enable           myipdb.identchars            myipdb.returnframe
myipdb.default               myipdb.do_l                  myipdb.doc_leader            myipdb.help_exec             myipdb.interaction           myipdb.ruler
myipdb.defaultFile           myipdb.do_list               myipdb.emptyline             myipdb.help_exit             myipdb.intro                 myipdb.run
myipdb.dispatch_call         myipdb.do_n                  myipdb.execRcLines           myipdb.help_h                myipdb.is_pydb               myipdb.runcall
ipdb> myipdb.
[331]中的
:%调试通过
注意:在ipdb>提示符处输入“c”以继续执行。
没有一个
> (1)()
ipdb>导入检查
ipdb>f=inspect.stack()[6]
ipdb>f0=f[0]
ipdb>myipdb=f0.f_局部变量['self']
ipdb>myipdb。
myipdb.alias myipdb.dispatch_exception myipdb.do_next myipdb.fncache myipdb.help_help myipdb.lastcmd myipdb.runctx
myipdb.botframe myipdb.dispatch_line myipdb.do_p myipdb.forget myipdb.help_ignore myipdb.lineinfo myipdb.runeval
myipdb.bp_命令myipdb.dispatch_返回myipdb.do_pdef myipdb.format_stack_条目myipdb.help_j myipdb.lineno myipdb.set_break
myipdb.break_anywhere myipdb.displayhook myipdb.do_pdoc myipdb.get_all_break myipdb.help_jump myipdb.list_命令_pydb myipdb.set_颜色
myipdb.break_此处myipdb.do_EOF myipdb.do_pfile myipdb.get_break myipdb.help_l myipdb.lookupmodule myipdb.set_继续
myipdb.breaks myipdb.do_a myipdb.do_pinfo myipdb.get_breaks myipdb.help_list myipdb.mainpyfile myipdb.set_next
myipdb.canonic myipdb.do_别名myipdb.do_pinfo2 myipdb.get_文件_中断myipdb.help_n myipdb.misc_头myipdb.set_退出
myipdb.checkline myipdb.do_参数myipdb.do_pp myipdb.get_names myipdb.help_next myipdb.new_do_down myipdb.set_返回
myipdb.clear\u all\u breaks myipdb.do\b myipdb.do\u psource myipdb.get\u stack myipdb.help\p myipdb.new\u do\u frame myipdb.set\u步骤
myipdb.clear_all_file_break myipdb.do_break myipdb.do_q myipdb.handle_命令_def myipdb.help_pdb myipdb.new_do_退出myipdb.set_trace
myipdb.clear_bpbynumber myipdb.do_bt myipdb.do_退出myipdb.help_EOF myipdb.help_pp myipdb.new_do_重新启动myipdb.set_直到
myipdb.clear_break myipdb.do_c myipdb.do_r myipdb.help_a myipdb.help_q myipdb.new_do_up myipdb.setup
myipdb.cmdloop myipdb.do_cl myipdb.do_重新启动myipdb.help_别名myipdb.help_退出myipdb.nohelp myipdb.shell
myipdb.cmdqueue myipdb.do_clear myipdb.do_return myipdb.help_args myipdb.help_r myipdb.onecmd myipdb.stack
myipdb.color_scheme_table myipdb.do_命令myipdb.do_retval myipdb.help_b myipdb.help_重新启动myipdb.parseline myipdb.stdin
myipdb.columnize myipdb.do_condition myipdb.do_run myipdb.help_break myipdb.help_return myipdb.parser myipdb.stdout
myipdb.commands myipdb.do_cont myipdb.do_rv myipdb.help_bt myipdb.help_运行myipdb.postcmd myipdb.stop_此处
myipdb.commands_bnum myipdb.do_continue myipdb.do_s myipdb.help_c myipdb.help_s m
In [331]: %debug pass
NOTE: Enter 'c' at the ipdb>  prompt to continue execution.
None
> <string>(1)<module>()

ipdb> import inspect
ipdb> f = inspect.stack()[6]
ipdb> f0 = f[0]
ipdb> myipdb = f0.f_locals['self']
ipdb> myipdb.
myipdb.aliases               myipdb.dispatch_exception    myipdb.do_next               myipdb.fncache               myipdb.help_help             myipdb.lastcmd               myipdb.runctx
myipdb.botframe              myipdb.dispatch_line         myipdb.do_p                  myipdb.forget                myipdb.help_ignore           myipdb.lineinfo              myipdb.runeval
myipdb.bp_commands           myipdb.dispatch_return       myipdb.do_pdef               myipdb.format_stack_entry    myipdb.help_j                myipdb.lineno                myipdb.set_break
myipdb.break_anywhere        myipdb.displayhook           myipdb.do_pdoc               myipdb.get_all_breaks        myipdb.help_jump             myipdb.list_command_pydb     myipdb.set_colors
myipdb.break_here            myipdb.do_EOF                myipdb.do_pfile              myipdb.get_break             myipdb.help_l                myipdb.lookupmodule          myipdb.set_continue
myipdb.breaks                myipdb.do_a                  myipdb.do_pinfo              myipdb.get_breaks            myipdb.help_list             myipdb.mainpyfile            myipdb.set_next
myipdb.canonic               myipdb.do_alias              myipdb.do_pinfo2             myipdb.get_file_breaks       myipdb.help_n                myipdb.misc_header           myipdb.set_quit
myipdb.checkline             myipdb.do_args               myipdb.do_pp                 myipdb.get_names             myipdb.help_next             myipdb.new_do_down           myipdb.set_return
myipdb.clear_all_breaks      myipdb.do_b                  myipdb.do_psource            myipdb.get_stack             myipdb.help_p                myipdb.new_do_frame          myipdb.set_step
myipdb.clear_all_file_breaks myipdb.do_break              myipdb.do_q                  myipdb.handle_command_def    myipdb.help_pdb              myipdb.new_do_quit           myipdb.set_trace
myipdb.clear_bpbynumber      myipdb.do_bt                 myipdb.do_quit               myipdb.help_EOF              myipdb.help_pp               myipdb.new_do_restart        myipdb.set_until
myipdb.clear_break           myipdb.do_c                  myipdb.do_r                  myipdb.help_a                myipdb.help_q                myipdb.new_do_up             myipdb.setup
myipdb.cmdloop               myipdb.do_cl                 myipdb.do_restart            myipdb.help_alias            myipdb.help_quit             myipdb.nohelp                myipdb.shell
myipdb.cmdqueue              myipdb.do_clear              myipdb.do_return             myipdb.help_args             myipdb.help_r                myipdb.onecmd                myipdb.stack
myipdb.color_scheme_table    myipdb.do_commands           myipdb.do_retval             myipdb.help_b                myipdb.help_restart          myipdb.parseline             myipdb.stdin
myipdb.columnize             myipdb.do_condition          myipdb.do_run                myipdb.help_break            myipdb.help_return           myipdb.parser                myipdb.stdout
myipdb.commands              myipdb.do_cont               myipdb.do_rv                 myipdb.help_bt               myipdb.help_run              myipdb.postcmd               myipdb.stop_here
myipdb.commands_bnum         myipdb.do_continue           myipdb.do_s                  myipdb.help_c                myipdb.help_s                myipdb.postloop              myipdb.stopframe
myipdb.commands_defining     myipdb.do_d                  myipdb.do_step               myipdb.help_cl               myipdb.help_step             myipdb.precmd                myipdb.stoplineno
myipdb.commands_doprompt     myipdb.do_debug              myipdb.do_tbreak             myipdb.help_clear            myipdb.help_tbreak           myipdb.preloop               myipdb.trace_dispatch
myipdb.commands_resuming     myipdb.do_disable            myipdb.do_u                  myipdb.help_commands         myipdb.help_u                myipdb.print_list_lines      myipdb.undoc_header
myipdb.commands_silent       myipdb.do_down               myipdb.do_unalias            myipdb.help_condition        myipdb.help_unalias          myipdb.print_stack_entry     myipdb.use_rawinput
myipdb.complete              myipdb.do_enable             myipdb.do_unt                myipdb.help_cont             myipdb.help_unt              myipdb.print_stack_trace     myipdb.user_call
myipdb.complete_help         myipdb.do_exit               myipdb.do_until              myipdb.help_continue         myipdb.help_until            myipdb.print_topics          myipdb.user_exception
myipdb.completedefault       myipdb.do_h                  myipdb.do_up                 myipdb.help_d                myipdb.help_up               myipdb.prompt                myipdb.user_line
myipdb.completekey           myipdb.do_help               myipdb.do_w                  myipdb.help_debug            myipdb.help_w                myipdb.quitting              myipdb.user_return
myipdb.completenames         myipdb.do_ignore             myipdb.do_whatis             myipdb.help_disable          myipdb.help_whatis           myipdb.rcLines
myipdb.curframe              myipdb.do_j                  myipdb.do_where              myipdb.help_down             myipdb.help_where            myipdb.reset
myipdb.curindex              myipdb.do_jump               myipdb.doc_header            myipdb.help_enable           myipdb.identchars            myipdb.returnframe
myipdb.default               myipdb.do_l                  myipdb.doc_leader            myipdb.help_exec             myipdb.interaction           myipdb.ruler
myipdb.defaultFile           myipdb.do_list               myipdb.emptyline             myipdb.help_exit             myipdb.intro                 myipdb.run
myipdb.dispatch_call         myipdb.do_n                  myipdb.execRcLines           myipdb.help_h                myipdb.is_pydb               myipdb.runcall
ipdb> myipdb.