This will work for print statements inside the module, but not for prints coming from arbitrary imported functions. I can't see how to achive the separation without walking stack on each print.
On Jan 31, 2:45 am, Dino Viehland <di...@microsoft.com> wrote: > Can you run each document on its own thread? > > Oh, it also looks like we actually flow CodeContext through to the caller. > So you could do something like: > > class MyFile { > public void write(CodeContext context, string data) { > Scope curScope = context.Scope; // this gives you the > module you're running in > > // handle write here keyed off of the scope object > } > > } > > And replace sys.stdout with that. > > -----Original Message----- > From: users-boun...@lists.ironpython.com > [mailto:users-boun...@lists.ironpython.com] On Behalf Of Jeff Slutter > Sent: Friday, January 30, 2009 6:41 PM > To: Discussion of IronPython > Subject: Re: [IronPython] Redirecting stdout/stderr, but with context > > Dino Viehland wrote: > > You can always provide your own stream which is aware of what the > > currentoutputwindow is. It could store this in a thread static or just > > some variable that you update whenever the active window changes. You can > > set that via ScriptRuntime.IO.OutputStream. You could conceptually do the > > exact same thing from Python just by setting sys.stdout to a file-like > > object which knows what the currentoutputwindow is. > > This is what I'm doing right now and that's where I'm having my problem. > I don't think this is a solvable problem since theoutputstream is > shared by all ScriptScopes, just as theoutputstream for > System.Console.WriteLine is the same across the process. > > In a nutshell, I have this: > > class Document > { > void AppendOutput( string text ) > { > m_buffer.Add(text); > } > List<string> m_buffer; > > } > > class ConsoleWindow: Form > { > public void WriteOutput( string text, Document doc ) > { > doc.AppendOutput( text ); > if( doc == m_currentDisplayingDoc ) > { > textBox.Text += text; > } > } > > } > > class DocWriter > { > public DocWriter( ConsoleWindow console, Document doc ) > { > m_console = console; > m_document = doc; > } > > public void write(string text) > { > m_console.WriteOutput( text, m_document ); > } > ConsoleWindow m_console; > Document m_document; > > } > > void OnDocumentActivate(Document doc) > { > DocWriter writer = new DocWrite(guiConsole, doc); > object sysObj = doc.scope.GetVariable("sys"); > m_engine.Operations.SetMember(sysObj, "stdout", writer); > m_engine.Operations.SetMember(sysObj, "stderr", writer); > > } > > The problem is: > If there is a script running on DocumentA, that is streamingoutput, and > then I switch to DocumentB while DocumentA continues to run - theoutput > for DocumentA starts appearing in the console window for DocumentB as if > it was for B. This is because sysout is system wide and if I change it > while DocumentA is writing, then it starts outputting to the new stream > that was set (and that was registered with DocumentB). > > -Jeff > _______________________________________________ > Users mailing list > us...@lists.ironpython.comhttp://lists.ironpython.com/listinfo.cgi/users-ironpython.com > _______________________________________________ > Users mailing list > us...@lists.ironpython.comhttp://lists.ironpython.com/listinfo.cgi/users-ironpython.com _______________________________________________ Users mailing list Users@lists.ironpython.com http://lists.ironpython.com/listinfo.cgi/users-ironpython.com