I've run into a somewhat unusual situation. I'm trying to script the interactive console (for teaching/testing purposes), and I tried the following:
$ 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 isn't printed, so clearly everything else was on stderr. So far so good. But then we redirect stderr:
$ python 2> /dev/null
>>> print 3
3
>>>
How can the prompt be printed in both cases?
EDIT: Redirecting both stdout and stderr causes absolutely nothing to be printed. So Python's clearly "choosing" one of stdout or stderr. Is that documented to happen? I couldn't figure out how this is actually done in the Python source code.
It seems like python checks whether stdout is a 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);
Sourcecode from Parser/myreadline.c around line 194.
It's possible that the interpreter imports the readline module at startup, in which case PyOS_ReadlineFunctionPointer will be set to call_readline, which uses the readline library. In particular it calls rl_callback_handler_install. The documentation of this function doesn't state where the prompt is printed, but it's possible that it checks whether stdout/stderr are ttys.
来源:https://stackoverflow.com/questions/18419787/where-does-pythons-interactive-prompt-output-to