classification
Title: Mention sys.displayhook in code module docs and the compile builtin docs
Type: behavior Stage: needs patch
Components: Documentation Versions: Python 3.1, Python 3.3, Python 2.7
process
Status: open Resolution:
Dependencies: Superseder:
Assigned To: docs@python Nosy List: aliles, docs@python, r.david.murray, santoso.wijaya, tebeka
Priority: normal Keywords: patch

Created on 2011-06-24 23:55 by tebeka, last changed 2012-08-27 13:08 by aliles.

Files
File name Uploaded Description Edit
p1346072775.diff aliles, 2012-08-27 13:08 review
Messages (5)
msg139004 - (view) Author: Miki Tebeka (tebeka) * Date: 2011-06-24 23:55
Currently, code.InteractiveConsole lets your override "write" which is the error stream. Allow overriding of "normal" (stdout) writing as well.
This will enable to spawn interpreters into custom stdin/stdout.

See twisted.manhole for example, very useful.
msg139074 - (view) Author: R. David Murray (r.david.murray) * (Python committer) Date: 2011-06-25 14:43
Well, the code is being executed by an exec call on a code object that was compiled with the 'single' flag, which is what causes non-None values to get "printed".  The compile docs aren't clear on how "printed" is implemented, but the answer is that it calls sys.displayhook.  So the way to control that part of the output is to assign your own function to sys.displayhook.  None of this is documented, and it should be (it took me a while to figure it out, and I had a suspicions about how it worked), so I'm changing this to a documentation bug.

However, you mention in the other ticket that are trying to do the interactive interpreter trick through a socket.  For that application I think you want to ignore both the write method and sys.displayhook, and instead directly patch sys.stdout and sys.stderr. Otherwise you'd also miss output sent to those destinations via print statements or writing directly to the sys objects, which would confuse the user of your interface since the in the normal interactive prompt those show up on the console.
msg139077 - (view) Author: Miki Tebeka (tebeka) * Date: 2011-06-25 14:52
Yeah, I though about using dup2 from stdout/stderr to the socket. However this means I can connect only one client at a time. Which was an issue I was trying to avoid. Didn't think about print statements though ...

Thanks.
msg139097 - (view) Author: R. David Murray (r.david.murray) * (Python committer) Date: 2011-06-25 16:23
Well, sys.stdout and sys.stderr don't have to be real file objects.  You could substitute a file-like object (one that implements the methods that get called during the interpretation loop) that does your multiplexing.  That kind of trick is one of the things that makes Python so much fun to work with :)
msg169199 - (view) Author: Aaron Iles (aliles) * Date: 2012-08-27 13:08
I've submitted a patch which adds a section to the code module's documentation on overriding console output. It attempts to catalogue when sys.stderr, sys.excepthook and sys.displayhook are used to print console output.
History
Date User Action Args
2012-08-27 13:08:47alilessetfiles: + p1346072775.diff

nosy: + aliles
messages: + msg169199

keywords: + patch
2011-06-25 16:23:20r.david.murraysetmessages: + msg139097
2011-06-25 14:52:57tebekasetmessages: + msg139077
2011-06-25 14:43:28r.david.murraysetassignee: docs@python
type: enhancement -> behavior

components: + Documentation
title: Allow overriding of writing to stdout in code.InteractiveConsole -> Mention sys.displayhook in code module docs and the compile builtin docs
nosy: + r.david.murray, docs@python
versions: + Python 3.1
messages: + msg139074
stage: needs patch
2011-06-25 00:34:34santoso.wijayasetnosy: + santoso.wijaya

versions: + Python 3.3
2011-06-24 23:55:44tebekacreate