Ответ 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.