Catching results of an exec

dsavitsk dsavitsk at
Wed Sep 18 22:54:47 EDT 2002

>>> class foo:
...     def do_it(self, arg):
...         exec(arg)
...     def get_it(self, arg):
...         return eval(arg)

>>> f = foo()
>>> f.do_it('self.a = "bar"')
>>> b = f.get_it('self.a')

is this too simple?


"Greg Fortune" <lists at> wrote in message
news:3d88f701$0$304$39cecf19 at
> Is there any way to "catch" the value produced by an exec?  I'm
> things like print statements that don't really assign a value, but do send
> a result to stdout.
> For example, if I execute
> exec('print dir()')
> from an interpreter, there will be some stuff spit out on the console.
> What if I really wanted to display the list from dir() in a different way?
> I'm working on a really dinky server that will sit on a machine and
> arbitrary python code.  I want the results from the code execution to be
> returned to client.
> Even just eval('dir()') exhibits the desired behavior, but only from an
> interactive interpreter.
> Right now I've got a nasty hack that redirects stdout, uses an
> InteractiveInterpereter from the code module to execute the code, writes
> an output file, reads the result from the file, restores stdout and then
> sends the result to the client.  Hopefully, that's a terrible way to do
>  It just occured to me that I can probably use a pipe in place of the
> output file, but still....
> It would be great if exec and eval set something somewhere that held the
> results of the code execution.  I looked in the InteractiveInterpreter
> (which, at least, kicks the results of the code execution out to stdout),
> but all it does is
> exec code in self.locals
> Did I miss something?
> Greg Fortune

More information about the Python-list mailing list