執行任意代碼,而停在斷點......我可以誘使Python認爲代碼是在該框架的實際本地範圍內執行嗎?
Python調試器pdb允許這樣做。例如,假設您正在調試的文件tests/scopeTest.py
,你必須在你的程序,其中變量尚未在程序本身聲明的下面一行:
print (NOT_DEFINED_IN_PROGRAM)
,這樣運行的代碼python tests/scopeTest.py
會導致在:
NameError: name 'NOT_DEFINED_IN_PROGRAM' is not defined
現在你想,當在調試器,停止線來定義變量,並有計劃繼續執行,使用變量,如果它已經在節目中一直定義。換句話說,您希望在該範圍內實現更改,以便您可以繼續使用該更改永久性執行。它實際上是可能的:
$ python -m pdb tests/scopeTest.py
> /home/user/tests/scopeTest.py(1)<module>()
-> print (NOT_DEFINED_IN_PROGRAM)
(Pdb) 'NOT_DEFINED_IN_PROGRAM' in locals()
False
(Pdb) NOT_DEFINED_IN_PROGRAM = 5
(Pdb) 'NOT_DEFINED_IN_PROGRAM' in locals()
True
(Pdb) step
5
PDB在其default
函數,該函數的等效執行此通過compile
和exec
:
code = compile(line + '\n', <stdin>, 'single')
exec(code, self.curframe.f_globals, self.curframe_locals)
其中self.curframe
是一個特定的幀。現在,self.curframe_locals
不self.curframe.f_locals
,因爲,作爲setup
功能說:
# The f_locals dictionary is updated from the actual frame
# locals whenever the .f_locals accessor is called, so we
# cache it here to ensure that modifications are not overwritten.
self.curframe_locals = self.curframe.f_locals
希望幫助,併爲你的意思!
的是,即使是這樣,你應該想,例如替換方案方面的功能正在調試與猴子打補丁的版本
拿筆記,如:
newGlobals['abs'] = myCustomAbsFunction
exec(code, newGlobals, locals)
的範圍myCustomAbsFunction
不會成爲用戶程序,但將成爲定義函數的上下文,這是調試器!這也有一種解決方法,但是由於沒有特別提出,所以現在留給讀者作爲練習。^__^
不是我希望的答案,但謝謝澄清Alex。 – flashk 2010-08-04 18:35:34