我意识到问题有点具体,对不起。
我试图解决一个蟒蛇拼图,我输入的内容得到exec
' ed。我的目标是在全局名称空间中存储任意长度的内容(例如,更改变量target
)。您将在下面看到我的输入仅限于35
字符。
以下是该计划:
#!/usr/bin/env python2
from sys import modules
modules.clear()
del modules
raw_input2 = raw_input
exception2 = Exception
__builtins__.__dict__.clear()
__builtins__ = None
target = None # change this !
while 1:
try:
scope = {'r':0}
exec 'r = ' + raw_input2()[:35] in scope
print 'Result:', scope['r']
except exception2, e:
print "Error: ", e
如上所述,我的意思是将数据存储在某个地方,因为vars
会在每个循环中重置。
globals()['target']=xxx
,但内置版已被停用。global target;target=xxx
,但这会在scope
中执行,而不是在全局范围内(我认为global
关键字必须出现在匿名函数的开头)< / LI>
__dict__
对象中,但我知道写入其中的唯一方法是通过globals()['target']=xxx
禁用().__class__.__base__
痛苦地访问超级对象,但是35
个字符的限制,它似乎不是那种方式(仅此字符串为{{已经有1个}字符,你需要两个以21
开头,所以只留下0;
字符来分配内容......)。有什么想法吗? 谢谢!
答案 0 :(得分:1)
答案是:写在__builtins__
。
示例输入:
1;__builtins__['a']="string1"
Result: 1
1;__builtins__['a']+="string2"
...实际上看起来很简单,因为它正好位于问题中标记为# change this
的变量之上。我还不完全理解为什么__builtins__
var在exec
范围内传递,特别是因为它应该是None
(因此不是字典),但可以像字典那样赋值。
但它有效,在python 2.7中测试