Try this... slightly more complex but get's the job done-> added some wait state in the user program/thread so it didn't kill the output stream... Enjoy
import thread, sys, time def someUserProgram(mutexRef): while 1: mutexRef.acquire() print "I am a user program" mutexRef.release() time.sleep(1) class main: def __init__(self): self.mutex = thread.allocate_lock() self.someProgram = None def mainProgram(self,someUserProgram): self.someProgram = someUserProgram self.executeOneStatement(self.someProgram) inval = '' while not inval == 'q': inval = sys.stdin.readline().strip() print "Doing some stuff here" thread.exit() def executeOneStatement(self,program): thread.start_new(program, (self.mutex,)) l = main() l.mainProgram(someUserProgram) 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. > > 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 > > 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. > > Anybody have a solution to this? I've done a bit of searching, looking > through python docs and sources and so forth, and I'm pretty stumped at this > point. > > Thanks. > > __________________________________________________ > Do You Yahoo!? > Tired of spam? Yahoo! Mail has the best spam protection around > http://mail.yahoo.com -- http://mail.python.org/mailman/listinfo/python-list