Задать вопрос
brutaler
@brutaler

Перенаправление вывода функций в python

Как перенаправить вывод определенной функции в файл, а затем вернуть поведение вывода так как оно было до этого?
  • Вопрос задан
  • 5082 просмотра
Подписаться 2 Оценить Комментировать
Решения вопроса 1
Amper
@Amper
Можно сделать декоратор, вроде такого:

import sys

def decorator(n):
def out_changer(f):
sys.stdout = open(n,«w+»)
def res_func(*args, **kwargs):
return f(*args, **kwargs)
return res_func
return out_changer

@decorator('testfile.txt')
def your_func(a):
for i in range(a):
print i

func(10)
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@Rifle
import sys, cStringIO, traceback

def capture(func, *args, **kwargs):
"""Capture the output of func when called with the given arguments.

The function output includes any exception raised. capture returns
a tuple of (function result, standard output, standard error).
"""
stdout, stderr = sys.stdout, sys.stderr
sys.stdout = c1 = cStringIO.StringIO()
sys.stderr = c2 = cStringIO.StringIO()
result = None
try:
result = func(*args, **kwargs)
except:
traceback.print_exc()
sys.stdout = stdout
sys.stderr = stderr
return (result, c1.getvalue(), c2.getvalue())

With the aid of capture it is easy to grab the disassembled code:

import dis

def disassemble(obj=None):
"""Capture the output of dis.dis and return it."""
return capture(dis.dis, obj)[1]
Ответ написан
Комментировать
@MikhailEdoshin
Заменить sys.stdout на файл или другой объект, поддерживающий такие же операции (StringIO подойдет), потом восстановить.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
SpectrumData Екатеринбург
от 200 000 до 300 000 ₽
Greenway Global Новосибирск
от 150 000 ₽
Akronix Санкт-Петербург
от 150 000 до 200 000 ₽
19 янв. 2025, в 14:08
2000 руб./за проект
19 янв. 2025, в 13:33
700000 руб./за проект
19 янв. 2025, в 13:04
400000 руб./за проект