【问题标题】:Local variables from within the pickle command string?pickle 命令字符串中的局部变量?
【发布时间】:2012-12-28 20:49:00
【问题描述】:

这是为了安全比赛,请不要对我大喊大叫:)

我正在尝试使用传递给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': []}

这里发生了什么,我该怎么做?

谢谢!

【问题讨论】:

    标签: python pickle


    【解决方案1】:

    pickle.loads() 函数无法直接访问您调用的代码的本地变量.loads()来自。它有自己的范围。在这种情况下,您正在查看处理您的 .loads() 调用的 pickle.Unpicler 实例上的方法之一的本地命名空间。

    您必须使用sys._getframe() 访问调用堆栈,然后查看各个帧的.f_locals 映射以到达调用函数的本地。

    pickle source猜测我想说你需要跳过3帧,当前调度方法,Unpickler.load调用当前调度方法的方法,模块级loads()函数,所以sys._getframe(3).f_locals['local_var']aught为您提供所需的参考资料。

    【讨论】:

    • 谢谢,我试试看!
    猜你喜欢
    • 2017-10-12
    • 2015-08-10
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    • 2014-04-04
    相关资源
    最近更新 更多