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

18 投票
2 回答
15504 浏览
提问于 2025-04-17 05:05

我想在运行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 个回答

0

其实,当你在pdb中给变量赋一个新值时,这个变量的值确实会改变。但是,如果你在pdb中再次读取这个变量,而没有运行你的代码,它可能会恢复到最初的值。

如果你回到你的代码中,你会发现它会使用你新的值(-40)。

试试这个:

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

这看起来是Python 2.6中的一个错误。在Python 2.7中,你应该可以做到这一点。

撰写回答