Куда идут stdout и stderr в режиме curses? - PullRequest
6 голосов
/ 10 февраля 2010

Куда идут stdout и stderr, когда curses активен?

import curses, sys

def test_streams():
    print "stdout"
    print >>sys.stderr, "stderr"

def curses_mode(stdscr):
    test_streams()

test_streams()
curses.wrapper(curses_mode)

Фактический вывод

stdout
stderr

Update0

Ожидаемый результат -

stdout
stderr
stdout
stderr

вход, а затем выход из режима проклятий без изменения окончательного текста, отображаемого в терминале.

1 Ответ

5 голосов
/ 10 февраля 2010

Активация curses сохраняет текущее содержимое экрана терминала и очищает его; Выход из проклятий восстанавливает содержимое экрана (отбрасывая все, что было на экране во время самого проклятия). Попробуйте использовать этот вариант кода, и вы лучше увидите, что происходит:

import curses, sys, time

def test_streams(wot):
    print wot, "stdout"
    print >>sys.stderr, wot, "stderr"

def curses_mode(stdscr):
    test_streams("wrap")
    time.sleep(1.0)

test_streams("before")
curses.wrapper(curses_mode)
test_streams("after")

Вы заметите wrap stderr на экране в течение секунды (во время сна) - он перезаписывает часть стандартного вывода - затем он исчезает, и вы видите четыре строки до и после на текущем покоящемся экране Вы можете добавить другие спящие, чтобы следить за тем, что происходит, даже более подробно, если вам это нужно.

...