Найти - Пользователи
Полная версия: песочница, exec() и __builtin__.__import__
Начало » Python для экспертов » песочница, exec() и __builtin__.__import__
1
alexandre
Вообщем была попытка сделать песочницу на питоне с помощью 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)
То все нормально. В чем разница не совсем понятно?
alexandre
Все решилось с помощью клаcсов. Была не совсем понятная проблема с областью видимости.
poltergeist
Изменять __builtin__.__import__ лучше с помощью try..finally блока, т.к. в случае любой ошибки оригинальный импорт обязательно должен быть восстановлен. О многопоточности видимо можно забыть.
alexandre
Спасибо восстановление в пример не вошло просто. Ну многопоточность да но в данном случае главное изолированность песочницы. Тут другая проблема всплыла обнаружилось что в питоне нет как таковой приватности:). Тоесть если поставить два подчеркивания перед атрибутом класса то он какбы приватный но если перед ним написать его класс с подчеркиванием то он становиться не приватным что с этим делать совсем не понятно все что пришло в голову это динамическое переименование класса, но этож извращение реализовывать приватность класса вместо языка.
Андрей Светлов
Нет в Питоне приватности. И надёжной песочницы тоже нет. Считается, что это не нужно.
Если требуется надёжная песочница — её следует выполнять в отдельном процессе в сильно обрезанной сборке Питона.
alexandre
Может попробовать javascript прикрутить к питону и в нем организовать песочницу? Если это нормально возможно?
Андрей Светлов
http://code.google.com/p/pyv8/ если хотите
alexandre
Надо попробовать выглядит классно. Интересно есть положительный опыт использования подобного для песочницы:)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB