【问题标题】:Is it possible to pass a variable out of a pdb session into the original interactive session?是否可以将 pdb 会话中的变量传递到原始交互式会话中?
【发布时间】:2009-07-11 16:37:10
【问题描述】:

我正在使用 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]

【问题讨论】:

    标签: python debugging ipython


    【解决方案1】:

    根据 ipython 的 docs,以及来自 ipython 提示符的 run? 命令,

    执行后,IPython 交互式命名空间获取 使用程序中定义的所有变量更新(__name__ 除外 和 sys.argv)

    “在程序中定义”(对术语的使用略显草率)并不意味着“在任何嵌套函数中的任何位置”——它的意思是“在你的脚本/模块的globals() 中”回复 running。如果您在任何类型的嵌套中,globals()['myvar'] = [1,2,3] 应该仍然可以正常工作,就像您希望的 export 存在时一样。

    编辑:如果您在不同的模块中,则需要在原始模块的全局变量中设置名称——如果需要,在 import sys 之后,sys.modules["originalmodule"].myvar = [1, 2, 3] 会做什么你想要的。

    【讨论】:

    • 我曾尝试将变量设为全局变量,但如果在其中一个框架中调用了另一个模块,这似乎不起作用。例如,如果你运行 test.py,它调用 test2.py 中的一个函数,然后在这个框架中声明一个全局,我在更高的框架(在另一个模块中执行)或之后的 ipython 命名空间中都看不到它。跨度>
    • 如果您在不同的模块中,则需要在原始模块的全局变量中设置名称——相应地编辑我的答案。
    • 事实证明,在从原始脚本调用的模块内的框架中创建一个全局变量只会将它放在该模块的 dict 中。因此,从最顶层开始,“test2”在 globals() 中,“myvar”在 globals()["test2"].__dict__ 中。我想我认为将变量设为 global 会将其直接放入顶部框架(和 ipython)的 globals() 中,但这似乎不起作用。
    • 在你的评论出现之前开始了我的最后一条评论。标记为已接受。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-20
    • 2020-11-05
    • 1970-01-01
    • 1970-01-01
    • 2014-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多