Пресечение печати как stdout python

Хорошо. Так что, вероятно, примером является хороший способ объяснить эту проблему.

Итак, у меня есть что-то вроде этого:

if __name__=="__main__"
    result = foobar()
    sys.stdout.write(str(result))
    sys.stdout.flush()
    sys.exit(0)

Теперь этот script вызывается из ruby ​​script.. и в основном он анализирует результат там. Но foobar() имеет множество отчетов о печати... и stdout сбрасывает все эти отпечатки. Есть ли способ (помимо протоколирования mathods), я могу что-то изменить здесь, что автоматически подавляет эти отпечатки и просто очищает этот результат? Благодаря

Ответ 1

Вы хотите временно (или иначе скрыть) stdout тень. Что-то вроде этого:

actualstdout = sys.stdout
sys.stdout = StringIO()
result = foobar()
sys.stdout = actualstdout
sys.stdout.write(str(result))
sys.stdout.flush()
sys.exit(0)

Вам нужно назначить что-то вроде файла sys.stdout, чтобы другие методы могли эффективно использовать его. StringIO - хороший кандидат, потому что он не требует доступа к диску (он просто собирается в памяти), а затем отбрасывается.

Ответ 2

С Python 3.4 и выше вы можете использовать redirect_stdout contextmanager следующим образом:

with redirect_stdout(open(os.devnull, "w")):
    print("This text goes nowhere")
print("This text gets printed normally")

Ответ 3

import sys

class output:
    def __init__(self):
        self.content = []
    def write(self, string):
        self.content.append(string)


if __name__=="__main__":

    out = output()                   
    sys.stdout = out                   #redirecting the output to a variable content

    result = foobar()
    sys.stdout.write(str(result))
    sys.stdout.flush() 

    sys.stdout = sys.__stdout__        #redirecting the output back to std output   
    print "o/p of foo :",out.content

    sys.exit(0)