Где вызывается интерактивная подсказка ">>>" Python?

Я столкнулся с несколько необычной ситуацией. Я пытаюсь использовать script интерактивную консоль (для обучения/тестирования), и я попробовал следующее:

$ python > /dev/null
Python 2.7.3 (v2.7.3:70274d53c1dd, Apr  9 2012, 20:52:43) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> print 3
>>> 

3 не печатается, поэтому ясно, что все остальное было на stderr. Все идет нормально. Но затем мы перенаправляем stderr:

$ python 2> /dev/null
>>> print 3
3
>>> 

Как можно распечатать приглашение в обоих случаях?

EDIT: перенаправление как stdout, так и stderr не приводит к тому, что ничего не печатается. Таким образом, Python явно "выбирает" один из stdout или stderr. Означает ли это, что это произошло? Я не мог понять, как это делается в исходном коде Python.

Ответ 1

Кажется, что python проверяет, является ли stdout tty:

/* This is needed to handle the unlikely case that the
 * interpreter is in interactive mode *and* stdin/out are not
 * a tty.  This can happen, for example if python is run like
 * this: python -i < test1.py
 */
if (!isatty (fileno (sys_stdin)) || !isatty (fileno (sys_stdout)))
    rv = PyOS_StdioReadline (sys_stdin, sys_stdout, prompt);
else
    rv = (*PyOS_ReadlineFunctionPointer)(sys_stdin, sys_stdout,
                                         prompt);

Исходный код из Parser/myreadline.c вокруг строки 194.

Возможно, что интерпретатор импортирует модуль readline при запуске, и в этом случае PyOS_ReadlineFunctionPointer будет установлен в call_readline, который использует библиотеку readline. В частности, он вызывает rl_callback_handler_install. Документация по этой функции не указывает, где распечатывается приглашение, но возможно, что он проверяет, являются ли stdout/stderr tty s.