Globally override built-in print function?

Robert Kern robert.kern at gmail.com
Thu Apr 15 19:18:01 EDT 2010


On 2010-04-15 18:08 PM, Dave W. wrote:
> I naively thought I could capture output from exec()'ed print
> invocations by (somehow) overriding 'print' globally.  But this
> seems not to be possible.  Or at least not easy:
>
> c:\d>test.py
> Python 2.6.2 (r262:71605, Apr 14 2009, 22:40:02) [MSC v.1500 32 bit
> (Intel)] win32
> Type "help", "copyright", "credits" or "license" for more info.
>>>> print("Hello?")
> Hello?
>>>>
>
> My custom print function isn't being called (see code below),
> I guess because its only being overridden in the current module?
> Is there some way to make InteractiveInterpreter/exec use my print
> function, or is this simply not possible?
>
> ----------
>
> ### File test.py ###
> from __future__ import print_function
> import sys
> from code import InteractiveInterpreter
> from contextlib import contextmanager
>
> def printhook(*args):
>      sys.stdout.write("printhook(): {0}\n".format(repr(args[0])))
>
> @contextmanager
> def global_printhook(printhook):
>      global print
>      print = printhook
>      yield
>      print = __builtins__.print

   old_print = __builtins__.print
   __builtins__.print = printhook
   yield
   __builtins__.print = old_print

But you really should replace sys.stdout and sys.stderr instead.

-- 
Robert Kern

"I have come to believe that the whole world is an enigma, a harmless enigma
  that is made terrible by our own mad attempt to interpret it as though it had
  an underlying truth."
   -- Umberto Eco




More information about the Python-list mailing list