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

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

$ 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
>>> 

Как распечатать подсказку в обоих случаях?

РЕДАКТИРОВАТЬ: перенаправление обоих stdout а также stderr абсолютно ничего не печатает. Так что Питон явно "выбирает" один из 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.

Другие вопросы по тегам