homepage

This issue tracker has been migrated to GitHub , and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

classification
Title: PyOS_StdioReadline is printing the prompt on stderr
Type: behavior Stage:
Components: Interpreter Core Versions: Python 3.6, Python 3.3, Python 3.4, Python 3.5, Python 2.7
process
Status: closed Resolution: duplicate
Dependencies: Superseder: Change input() to always prompt to stderr
View: 1927
Assigned To: Nosy List: Albert.Zeyer, Drekin, martin.panter
Priority: normal Keywords:

Created on 2011年08月31日 14:38 by Albert.Zeyer, last changed 2022年04月11日 14:57 by admin. This issue is now closed.

Messages (6)
msg143256 - (view) Author: Albert Zeyer (Albert.Zeyer) * Date: 2011年08月31日 14:38
PyOS_StdioReadline from Parser/myreadline.c is printing the prompt on stderr.
I think it should print it on the given parameter sys_stdout. Other readline implementations (like from the readline module) also behave this way.
Even if it really is supposed to write on stderr, it should use the `sys.stderr` and not the system stderr.
msg196114 - (view) Author: Adam Bartoš (Drekin) * Date: 2013年08月25日 08:40
Related stackoverflow question: http://stackoverflow.com/questions/18419787/where-does-pythons-interactive-prompt-output-to .
msg247982 - (view) Author: Martin Panter (martin.panter) * (Python committer) Date: 2015年08月04日 04:30
Results of experimenting on 3.6:
* The startup messages are written to standard error.
* The interactive interpreter prompts to the original standard error if Readline not used. But with Gnu Readline, prompts do go to the original standard output, as does other interactive Readline output (echoed input etc). This is what Albert reported.
* The interactive interpreter always reads from the original standard input, whether Readline is used or not.
* The displayhook() function always writes to the current sys.stdout, as documented.
* The excepthook() function always writes to the current sys.stderr, also as documented.
* The input() function is documented to prompt to sys.stdout, however see Issue 1927 for some quirks with that.
* The input() function always reads from the current sys.stdin. The Readline library is only used if sys.stdin and sys.stdout are the original file descriptors.
I agree it would probably be more consistent for the interpreter prompt to go to standard output. It looks like stdout is inspected to determine whether Readline will be used, while stderr is not inspected. So it makes sense for the prompt to go to stdout.
However I disagree that it should go to a redirected stream, sys.stderr or sys.stdout, since sys.stdin does not affect input. But see Issue 17620, about redirecting sys.stdin.
msg255077 - (view) Author: Martin Panter (martin.panter) * (Python committer) Date: 2015年11月22日 00:14
Actually Issue 1927 has a simple patch which should change this to stdout. I haven’t tested, the code looks like that patch will not use a redirected sys.stdout, so it would match not using a redirected sys.stdin.
msg255096 - (view) Author: Adam Bartoš (Drekin) * Date: 2015年11月22日 12:32
> * The interactive interpreter always reads from the original standard input, whether Readline is used or not.
This is not true – the interactive interpreter reads via PyOS_Readline, which may call whatever readline hook is installed.
I think the situation would be much more clear if something like my proposal was implemented (https://mail.python.org/pipermail/python-dev/2015-November/142246.html).
msg258570 - (view) Author: Martin Panter (martin.panter) * (Python committer) Date: 2016年01月19日 02:50
Adam: My experiments were assuming that PyOS_Readline() only ever uses the basic implementation or the Readline library, in order to see if there was any consistency with how Python worked in common situations.
There is actually a test that waits for the interpreter prompt on stderr; see test_cmd_line_script.CmdLineTest.interactive_python(). I realized that changing this would have to be considered carefully, because it could easily break other code as well. It certainly should not be done in a bug fix release.
Anyway I am proposing a patch in Issue 1927 to fix PyOS_StdioReadline(), so closing this as a duplicate.
History
Date User Action Args
2022年04月11日 14:57:21adminsetgithub: 57078
2016年01月19日 02:50:54martin.pantersetstatus: open -> closed
superseder: Change input() to always prompt to stderr
messages: + msg258570

components: + Interpreter Core, - Extension Modules
resolution: duplicate
2015年11月22日 12:32:16Drekinsetmessages: + msg255096
2015年11月22日 00:14:32martin.pantersetmessages: + msg255077
2015年08月04日 04:30:06martin.pantersetnosy: + martin.panter

messages: + msg247982
versions: + Python 3.5, Python 3.6
2013年08月25日 08:40:06Drekinsetnosy: + Drekin
messages: + msg196114
2013年02月19日 20:10:23ezio.melottisettype: behavior
components: + Extension Modules
versions: + Python 3.3, Python 3.4
2011年08月31日 14:38:37Albert.Zeyercreate

AltStyle によって変換されたページ (->オリジナル) /