PDB - 在交互模式下设置或更改变量

PDB - Set or change Variable in interactive mode

目前,当我在 pdb 的交互式解释器中修改变量时,它不会在交互式会话之外进行。有办法做到这一点吗?(我已经知道 exec,!)。但是,我想执行一些多行操作。

(Pdb) c
(Pdb) pp locals()['a']
*** KeyError: 'a'
(Pdb) !a=2
(Pdb) pp locals()['a']
2
(Pdb) !del a             
(Pdb) pp locals()['a']   
*** KeyError: 'a'        
(Pdb) interact                       
*interactive*                        
>>> a=2                              
>>>                                  
now exiting InteractiveConsole...    
(Pdb) pp locals()['a']               
*** KeyError: 'a' 

正如 Nbfour 和我自己在上面的评论中提到的,默认的 pdb.Pdb class 不在与正在调试的当前帧所使用的名称空间相同的名称空间上运行。相反,包含局部变量的 dict 被复制,并且 interactive-mode 在复制的 dict 上工作。这发生在默认 Pdb class.

定义的 do_interact 方法中

Subclassing pdb.Pdb,我们可以实现所需的行为:

import pdb
import code

class MyPdb(pdb.Pdb):
    def do_interact(self, arg):
        code.interact("*interactive*", local=self.curframe_locals)

MyPdb().set_trace()

运行 上面的脚本,我们对本地状态的 interactive-mode 更改现在是永久性的:

(Pdb) pp locals()['a']
*** KeyError: 'a'
(Pdb) !a=2
(Pdb) pp locals()['a']
2
(Pdb) !del a
(Pdb) pp locals()['a']
*** KeyError: 'a'
(Pdb) interact
*interactive*
>>> a=2
>>>
now exiting InteractiveConsole...
(Pdb) pp locals()['a']
2

pdb/ipdb

中调试时尝试使用以下代码执行多行代码
!import code; code.interact(local=vars())

这将进入interactive console

pdb 仅用于检查您的代码,那里的任何更改仅适用于该执行,不会改变您的代码