Как перехватить (получить) вывод "eval(command)" в переменную?
Нужно выполнить eval(code). Допустим, code = 'print('hw')'. Результат сохранить в строку. Имею в виду то, что code вводится пользователем. Нужно получить "hw".
Ответы (1 шт):
Автор решения: gil9red
→ Ссылка
Для перехвата вывода можно использовать contextlib.redirect_stdout, а для сохранения перехваченного io.StringIO.
from io import StringIO
from contextlib import redirect_stdout
with StringIO() as f, redirect_stdout(f):
code = "print('hw')"
eval(code)
# Read from IO
result = f.getvalue()
print(repr(result)) # 'hw\n'
PS.
Есть два потока вывода stdout и stderr (в консоли этот вывод, как правило, закрашен красным цветом).
В первый по умолчанию пишет print, а вот всякие исключения могут быть выведены в stderr и для перехвата их нужно использовать contextlib.redirect_stderr:
with StringIO() as f, redirect_stdout(f), redirect_stderr(f):
...