【问题标题】:How do I change a value while debugging python with pdb?使用 pdb 调试 python 时如何更改值?
【发布时间】:2011-10-27 07:23:16
【问题描述】:

我想运行 pdb,单步执行代码,并在某个时候更改某个名称指向的值。所以我可能想更改名称“stationLat”所指向的值。但我好像做不到。示例如下:

>>> import extractPercentiles
>>> import pdb
>>> pdb.run( "extractPercentiles.extractOneStation()" )
> <string>(1)<module>()->None
(Pdb) s
--Call--
> /scratch/extractPercentiles.py(96)extractOneStation()
-> def extractOneStation() :
(Pdb) tbreak 132
Breakpoint 3 at /scratch/extractPercentiles.py:132
(Pdb) c

Deleted breakpoint 3
> /scratch/extractPercentiles.py(132)extractOneStation()
-> stationLon = float(stationLoc[3])

所以现在我想更改 stationlat 的值。 Pdb 似乎允许我将 stationLat 设置为一个新值,但是当我检查该值时,它没有改变:

(Pdb) stationLat
-34.171100000000003
(Pdb) stationLat = -40
(Pdb) stationLat   
-34.171100000000003
(Pdb) !stationLat = -40
(Pdb) stationLat
-34.171100000000003
(Pdb) 

你可以看到我尝试使用 !同样,没有成功。

pdb 手册说我应该能够更改变量:

调试器无法识别的命令被假定为 Python 语句,并在被调试程序的上下文中执行。 Python 语句也可以使用感叹号 (!) 作为前缀。这是检查被调试程序的有效方法; 甚至可以更改变量或调用函数

这是范围问题吗?这与我启动 pdb 的方式有关吗?我尝试了嵌入的“pdb.set_trace”习语,得到了相同的结果。

感谢阅读。

【问题讨论】:

    标签: python debugging pdb


    【解决方案1】:

    这似乎是bug in Python 2.6。你应该可以在 Python 2.7 中做到这一点。

    【讨论】:

    • 啊!好,谢谢。我想也许我必须解开名称或使用一些特殊的命名空间。我也尝试过上下帧堆栈。
    • 哦,我会记录一下,对于这个项目,我不得不在 python 2.5.2 中工作,但仍然存在错误。
    • 另外,有些变量是不能赋值的。像“a”或“b”
    • 如果在赋值语句前使用!,则可以赋值,如问题中所述。
    • @Michael Hoffman,感叹号有效。你为什么不修改答案,而是添加了评论?
    【解决方案2】:

    实际上,当您在 pdb 中分配新值时,变量的值确实会发生变化。但是如果你在不运行代码的情况下再次尝试读取 pdb 中的变量,它可能会重置为原始值。

    如果您返回到您的代码,您应该会看到它将使用您的新值 (-40)。

    试试这个:

    stationLat = -40
    s # step back into code
    stationLat # should display -40
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-20
      • 1970-01-01
      • 1970-01-01
      • 2014-10-27
      相关资源
      最近更新 更多