Перенаправление stdout из python для вызовов C

Это продолжение вопроса от здесь, конкретно касающегося его ответа.


Из модуля python я вызываю Hello World исполняемый файл, который просто печатает Hello World в stdout. Я заинтересован в перенаправлении этого вывода в python StringIO и наткнулся на этот ответ, который почти привел меня к решению.

Критической частью этого ответа является этот сегмент кода:

1. def redirect_stdout():
2.     print "Redirecting stdout"
3.     sys.stdout.flush() # <--- important when redirecting to files
4.     newstdout = os.dup(1)
5.     devnull = os.open('/dev/null', os.O_WRONLY)
6.     os.dup2(devnull, 1)
7.     os.close(devnull)
8.     sys.stdout = os.fdopen(newstdout, 'w')

Также я хотел бы восстановить stdout в том виде, в котором он был до перенаправления.

Вопросы

  1. Что именно происходит в функции выше?
    • Что делают dup и dup2?
    • Что такое /dev/null?
    • Что делает строка 8? (sys.stdout = os.fdopen(newstdout, 'w'))
  2. Как я могу сохранить stdout в объекте StringIO?
  3. Как восстановить stdout после вызова моей программы Hello World?

Я почти уверен, что как только я получу ответ на вопрос 1, ответы на вопросы 2 и 3 будут простыми. Но я все равно решил их опубликовать, чтобы подтолкнуть ответ на вопрос 1 к тому направлению, в котором я хочу двигаться.

9
задан Community 23 May 2017 в 12:18
поделиться