2011-10-27 26 views
12

我想運行pdb,逐步執行代碼,並在某些時候更改某個名稱指向的值。所以我可能想改變'stationLat'這個名字所指的值。但似乎我不能。這裏的例子:如何在使用pdb調試python時更改值?

>>> 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」成語,並得到了相同的結果。

感謝您的閱讀。

回答

9

這似乎是bug in Python 2.6。你應該可以在Python 2.7中做到這一點。

+0

啊!好,謝謝。我想也許我必須去掉名字或者使用一些特殊的命名空間。我曾嘗試過在框架堆棧上下。 –

+1

哦,我會記錄這個項目,我不得不在python 2.5.2中工作,這仍然存在bug。 –

+0

也有一些你不能指定的變量。如「a」或「b」 – dtc

0

實際上,當您在pdb中分配新值時,變量的值會發生變化。但是,如果您嘗試在不運行代碼的情況下再次讀取pdb中的變量,則可能會重置爲原始值。

如果您退回到代碼中,您應該看到它將使用您的新值(-40)。

試試這個:

stationLat = -40 
s # step back into code 
stationLat # should display -40 
相關問題