在pdb会话中将变量传递回原始交互会话是否可能?

3 投票
1 回答
802 浏览
提问于 2025-04-15 12:50

我正在使用pdb这个工具来检查一个在ipython会话中运行的脚本,命令是run -d。我希望能绘制一些变量的图,但我需要在主ipython环境中才能做到这一点。

所以我想找一种方法,让我在退出pdb后,能把一个变量带回到主交互会话中。如果你在最上面的框架中设置一个变量,它似乎会出现在ipython会话中,但如果是在更下面的框架,这个方法就不管用了。

我想要的效果有点像下面的export命令:

ipdb> myvar = [1,2,3]
ipdb> p myvar
[1, 2, 3]
ipdb> export myvar
ipdb> q

In [66]: myvar
Out[66]: [1, 2, 3]

1 个回答

3

根据ipython的文档和ipython提示符下的run?命令,

执行后,IPython的交互命名空间会更新,包含程序中定义的所有变量(除了__name__和sys.argv)。

这里所说的“在程序中定义”其实是个不太严谨的说法,它并不是指“在任何嵌套函数中”,而是指“在你正在run的脚本或模块的globals()中”。如果你在某种嵌套结构中,globals()['myvar'] = [1,2,3]依然可以正常工作,就像你希望的export一样,如果它存在的话。

编辑:如果你在一个不同的模块中,你需要在原始模块的全局变量中设置名称——如果需要先import sys,那么sys.modules["originalmodule"].myvar = [1, 2, 3]就能实现你想要的效果。

撰写回答