Куда выводит интерактивная подсказка 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.