2017-01-05 3 views
0

У меня есть функция (в каком-то проекте), которая выводит результат. Когда я вызываю ее из командной строки или в другой проект python, она печатает выходные данные на терминале. Но я хочу, чтобы хранить все результаты печати в переменной, что-то вроде этого:Назначить вывод функции для печати в переменной python

output = function_name(function_args) 

и вместо печати результатов на терминале я хочу, чтобы хранить их в переменной output. также, основная функция возвращает что-то (просто число как статус), в результате чего я не хочу этого числа.

+4

Почему вы не исправляете функцию для возврата результата вместо печати? – Barmar

+0

Возможно, это код библиотеки, который пользователь не может изменить. Дайте преимущество сомнению! – wim

+0

@wim для моего собственного любопытства, когда это возникает? Просто, что компания этого не допускает, или существует практическое ограничение, присущее питону? – roganjosh

ответ

1

Вы можете сделать это подменой sys.stdout:

>>> def foo(): 
...  print('potato') 
... 
>>> import sys, io 
>>> sys.stdout = io.StringIO() 
>>> foo() 
>>> val = sys.stdout.getvalue() 
>>> sys.stdout = sys.__stdout__ # restores original stdout 
>>> print(val) 
potato 

Для более хорошим способом, чтобы сделать это, рассмотрим написание менеджер контекста. Если вы находитесь на Python 3.4+, это already been written for you.

>>> from contextlib import redirect_stdout 
>>> f = io.StringIO() 
>>> with redirect_stdout(f): 
...  foo() 
... 
>>> print(f.getvalue()) 
potato 
0

Разумное решение прост и очевидно: исправить функцию так, чтобы она вернула правильные данные, а не печатала их. Еще вам может использовать хак, отправленный wim, но при условии, что у вас есть рука на неисправной функции, прибегая к такому запутанному решению, попадает в категорию «WTF».

NB, конечно, если у вас нет руки в коде функции или это всего лишь 5 минут с одним выстрелом, то захват sys.stdout - это удобный запас.

Смежные вопросы