Where does Python's interactive prompt ">>>" output to?

python, python-interactive

Solution

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 `tty`s.

Problem

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.

Original source