Catching results of an exec

dsavitsk dsavitsk at e-coli.net
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')
bar

is this too simple?

-d


"Greg Fortune" <lists at gregfortune.com> wrote in message
news:3d88f701$0$304$39cecf19 at nnrp1.twtelecom.net...
> Is there any way to "catch" the value produced by an exec?  I'm
considering
> 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
execute
> 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
to
> 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.
>  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