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
仅用于检查您的代码,那里的任何更改仅适用于该执行,不会改变您的代码
目前,当我在 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
仅用于检查您的代码,那里的任何更改仅适用于该执行,不会改变您的代码