Пресечение печати как 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)
Ответ 4
Эта ссылка показывает, как перенаправить stdout в python. Перенесите его на внутреннюю трубу, затем прочитайте свою трубку и отфильтруйте ненужные строки. Это позволит вам сохранить только те строки, которые вас интересуют.