Вообщем была попытка сделать песочницу на питоне с помощью exec() естесно запретив лишние импорты, для простых вещей типа 2+2 она работает отлично. Но вот понадобилось получить из базы что нить то есть все таки добавить хитрым образом нужный импорт и тут затык.
import __builtin__
i = __builtin__.__import__
def importer(a, s, d, f=[], g=-1):
aaa = {"json":True, "simplejson":True, "decoder":True}
print a
if a in aaa:
return i(a, s, d, f, g)
return None
clean_db = None
def get_doc(doc_id):
doc = clean_db[doc_id]
return doc['head_field']
def ttt():
clean_db = couch['db']
try:
param = {"get_doc":get_doc}
#запрещаем импорт
__builtin__.__import__ = importer
exec("""get_doc("4b24907ade8de755b66b1474ff0034d7")""", param)
#разрешаем импорт
__builtin__.__import__ = i
except Exception, e:
print "ошибка песочницы %s, строка %s" % (e, traceback.format_exception(*sys.exc_info())[1])
ttt()
Выдает ошибку
ошибка песочницы 'NoneType' object is unsubscriptable, in ttt
exec("""get_doc("4b24907ade8de755b66b1474ff0034d7")""", param)
если функцию ttt закоментировать например а просто написать
clean_db = couch['py']
__builtin__.__import__ = importer
param = {"get_doc":get_doc}
exec("""get_doc("4b24907ade8de755b66b1474ff0034d7")""", param)
То все нормально. В чем разница не совсем понятно?