Я запускаю следующий код, используя RestrictedPython
(используя safeglobals['_print_'] = PrintCollector
и compile_restricted_exec
/ exec(compiled_code, safe_globals, locals)
).
def foo():
print 'bar'
print '123'
foo()
После выполнения кода я могу получить вывод на печать через locals.pop('_print')
, который содержит экземпляр PrintCollector
, но только для оператора print '123'
, который находится вне функции. При отладке я вижу два экземпляра PrintCollector
, предположительно для двух контекстов (уровень модуля и функция), в которых используется оператор print
.
Однако я не могу найти способ доступа к экземпляру PrintCollector
, который был создан при вводе def foo()
. Документация для RestrictedPython
довольно скудная, поэтому я спрашиваю здесь любой совет о том, как можно получить доступ к выводу на печать функции по RestrictedPython
.
Пример: * * один тысяча двадцать-одна
from RestrictedPython import compile_restricted
from RestrictedPython.PrintCollector import PrintCollector
_print_ = PrintCollector
code_string = """
def foo():
print 'bar'
print '123'
foo()
"""
loc = {'_print_': PrintCollector, '_getattr_': getattr}
compiled_code = compile_restricted(code_string, '<string>', 'exec')
exec(compiled_code, loc)
loc['_print']()