2012-12-28 66 views
0

這是一個安全競爭,請不要吼我:)pickle命令字符串中的局部變量?

我想通過傳遞到pickle.loads()字符串訪問本地變量。例如,我願做這樣的事情:

local_var = 1 
pickle.loads('''c__builtin__ 
eval 
(c__builtin__ 
compile 
(S"print local_var" 
S"error_output_file" 
S"exec" 
tRtR.''') 

不過,我得到以下錯誤:NameError: name 'local_var' is not defined

事實上,當我檢查局部變量,它們是從我所期望的完全不同:

pickle.loads("""c__builtin__ 
locals 
(tR.""") 

{'args':(), 
'func': <function locals>, 
'self': <pickle.Unpickler instance at 0x108af3830>, 
'stack': []} 

這是怎麼回事^ h那麼,我該如何做我想做的事?

謝謝!

回答

2

功能pickle.loads()功能沒有直接訪問您所稱爲.loads()的代碼的當地人從。它有它自己的範圍。在這種情況下,您正在查看pickle.Unpicler實例中正在處理您的.loads()調用的其中一個方法的本地名稱空間。

您必須使用sys._getframe()才能訪問調用堆棧,然後查看單個幀的.f_locals映射以到達調用函數的本地。

pickle source猜我會說你需要跳過3幀,當前的調度方法,該方法Unpickler.load調用當前調度方法,和模塊級loads()功能,所以sys._getframe(3).f_locals['local_var']奧特得到你想要的參考。

+0

謝謝,我會試試看! – des4maisons