如何在使用pdb进行Python调试时更改值?

18

我想运行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”习惯用法,但得到了相同的结果。

谢谢阅读。

2个回答

10

这似乎是Python 2.6中的错误。您应该可以在Python 2.7中完成此操作。


啊!好的,谢谢。我以为可能需要解开名称或使用一些特殊的命名空间。我也尝试过上下移动帧栈。 - Andrej Panjkov
1
哦,我会记录下来,因为这个项目我被迫回到使用Python 2.5.2,它仍然存在这个错误。 - Andrej Panjkov
还有一些变量是不能被赋值的,比如 "a" 或者 "b"。 - dtc
3
如问题所述,如果在赋值语句前使用 !,则可以将它们分配。请注意,本次翻译不包含解释或其他内容。 - Michael Hoffman
@Michael Hoffman,感叹号起作用了。为什么你没有修改你的答案,而是添加了一个评论呢? - Apostolos
经过一些测试,我意识到感叹号解决方案只能暂时起作用!也许根本不行。例如,如果您执行 (Pdb) w 来检查代码行,然后再次检查该值,则会看到旧值。这是一个巨大的“pdb”错误!最好不要修改值! - Apostolos

0

实际上,在pdb中赋予变量新值时,变量的值确实会改变。但是,如果您在不运行代码的情况下再次尝试在pdb中读取变量,则它可能会重置为原始值。

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

请尝试这个:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接