Line by line execution of python code
Stefan Behnel
stefan.behnel-n05pAM at web.de
Fri Jul 14 01:07:13 EDT 2006
Justin Powell wrote:
> Hi, I'm looking for suggestions on how to accomplish something in python. If
> this is the wrong list for such things, I appologize and please disregard the
> rest.
No, this is totally the right place.
> My application needs to allow users to create scripts which will be executed
> in a statement-by-statement fashion. Here's a little pseudo-code:
>
> def someUserProgram():
> while 1:
> print "I am a user program"
>
> def mainProgram():
> someProgram = someUserProgram
> while 1:
> print "Doing some stuff here"
> executeOneStatement(someProgram)
>
> def executeOneStatement(program):
> # What goes in here?
>
> I would expect the output to look like this:
>
> Doing some stuff here
> Doing some stuff here
> I am a sub program
> Doing some stuff here
> Doing some stuff here
> I am a sub program
> etc.
>
> It's possible to use generators to accomplish this, but unfortunately a
> state-ment by statement executing would require that every other statement is
> a yield. That would either force the users to put in a yield after every
> statement, or require a mechanism that parses the source and inserts yield
> statement before execution. Neither of these are really satisfactory.
Hmm, ok, so you don't want to manually interfere with the partial programs.
What I could think of is some form of code manipulation where you scan the
source code of the function you get passed and add a yield after each statement.
http://docs.python.org/dev/lib/inspect-source.html
http://docs.python.org/dev/lib/module-parser.html
> The other methods I've considered for doing this cleanly (subclassing the
> debugger, or the interactive interpreter) seem to revolve around sys.settrace
> and a callback trace function. I couldn't figure out a way to use this
> mechanism to resume the main loop from the trace function, and then also
> resume the user program the next time around, without the call stack just
> spiraling out of control.
I assume that tracing would be a good solution, though. Maybe someone else can
tell you how to use it better than I could.
You should tell us a bit more about the actual use case, i.e. *why* you need
this. Maybe there's a better solution to the whole problem after all.
Stefan
More information about the Python-list
mailing list