From: Stuart D. G. <st...@bm...> - 2002-08-26 17:56:03
|
Our Java applications support multiple users per JVM. This (along with no GUI code on the server) allows us to support dozens of active users on a 32M server. I didn't have much trouble embedding Jython as a scripting language for exploring and testing a running system. I am using the 'InteractiveConsole' class, which provides an independent namespace and interpreter context for each session. However, console output seems to go to a static object in the 'Py' class. This has the effect that all console output from all sessions goes to the last session to connect to the jython interpreter. Am I missing something, or is this a design oversight? How can I virtualize console output? I found it necessary to override 'raw_input' to virtualize console input. By overriding 'write', I can fix the immediate problem of console output. What else do I need to do to keep each sessions interpreter independent (except for common state reached via a name introduced into the initial namespace)? -- Stuart D. Gathman <st...@bm...> Business Management Systems Inc. Phone: 703 591-0911 Fax: 703 591-6154 "[Microsoft] products are even less buggy than others, in terms of per capita usage." - Steve Balmer, Microsoft Corporation |
From: Samuele P. <pe...@in...> - 2002-08-26 18:28:25
|
From: Stuart D. Gathman <st...@bm...> > Our Java applications support multiple users per JVM. This (along with no > GUI code on the server) allows us to support dozens of active users on a > 32M server. I didn't have much trouble embedding Jython as a scripting > language for exploring and testing a running system. I am using > the 'InteractiveConsole' class, which provides an independent > namespace and interpreter context for each session. > > However, console output seems to go to a static object in the 'Py' class. but the static objects redirect things to the current PySystemState a.k.a sys.stdout ... > This has the effect that all console output from all sessions goes to the > last session to connect to the jython interpreter. Am I missing > something, or is this a design oversight? How can I virtualize console > output? I found it necessary to override 'raw_input' to virtualize > console input. By overriding 'write', I can fix the immediate problem of > console output. What else do I need to do to keep each sessions > interpreter independent (except for common state reached via a name > introduced into the initial namespace)? > you can try this public class InteractiveConsole2 extends org.python.util.InteractiveConsole { public InteractiveConsole2() { super(); this.systemState = new org.python.core.PySystemState(); } } [which solves the problem that there is no InteractiveConsole ctr that give access the PythonInterpreter ctr form taking also a PySystemState ] and the in each session change sys.stdout, sys.stdin, sys.stderr. regards. |
From: Stuart D. G. <st...@bm...> - 2002-08-26 19:54:27
|
On Mon, 26 Aug 2002, Samuele Pedroni wrote: > > This has the effect that all console output from all sessions goes to the > > last session to connect to the jython interpreter. Am I missing > you can try this > > public class InteractiveConsole2 extends org.python.util.InteractiveConsole { > > public InteractiveConsole2() { > super(); > this.systemState = new org.python.core.PySystemState(); > } > > } I did the above, and also do: OutputStream termout = req.getOutputStream(); // get console output for write() if used. // this.conout = new OutputStreamWriter(termout); setErr(termout); setOut(termout); set("edxreq",req); set("edxjava",req.getEdxjava()); InputStream in = req.getInputStream(); // get console input for raw_input() this.con = new BufferedReader(new InputStreamReader(in)); interact(); and no longer override write(String). This causes most Jython output to go to the proper session console, but the banner printer by interact() still goes to the JVM's System.err (which is shared by all sessions and goes to a log file). Is it necessary to virtualize System.err, or should I just keep overriding write(String) as well? -- Stuart D. Gathman <st...@bm...> Business Management Systems Inc. Phone: 703 591-0911 Fax: 703 591-6154 "[Microsoft] products are even less buggy than others, in terms of per capita usage." - Steve Balmer, Microsoft Corporation |
From: Samuele P. <pe...@in...> - 2002-08-26 20:09:20
|
From: Stuart D. Gathman <st...@bm...> > > This causes most Jython output to go to the proper session console, but > the banner printer by interact() still goes to the JVM's > System.err (which is shared by all sessions and goes to a log file). Is it > necessary to virtualize System.err, or should I just > keep overriding write(String) as well? > Sorry, if the problem is just the banner I think this further change should fix the problem > > public InteractiveConsole2() { > > super(); > > this.systemState = new org.python.core.PySystemState(); this.setState(); > > } regards. |
From: Stuart D. G. <st...@bm...> - 2002-08-26 20:48:57
|
On Mon, 26 Aug 2002, Samuele Pedroni wrote: > From: Stuart D. Gathman <st...@bm...> > > This causes most Jython output to go to the proper session console, but > > the banner printer by interact() still goes to the JVM's > > System.err (which is shared by all sessions and goes to a log file). Is it > > necessary to virtualize System.err, or should I just > > keep overriding write(String) as well? > > Sorry, if the problem is just the banner I think this further change should > fix the problem > > > > public InteractiveConsole2() { > > > super(); > > > this.systemState = new org.python.core.PySystemState(); > this.setState(); > > > } > > regards. Nope. Banner still goes to System.err unless I override write(). Things are OK for now since overriding write() does the trick, but I'll keep trying your suggestions if you are curious . . . -- Stuart D. Gathman <st...@bm...> Business Management Systems Inc. Phone: 703 591-0911 Fax: 703 591-6154 "[Microsoft] products are even less buggy than others, in terms of per capita usage." - Steve Balmer, Microsoft Corporation |
From: Samuele P. <pe...@in...> - 2002-08-26 21:46:03
|
From: Stuart D. Gathman <st...@bm...> > On Mon, 26 Aug 2002, Samuele Pedroni wrote: > > > From: Stuart D. Gathman <st...@bm...> > > > > This causes most Jython output to go to the proper session console, but > > > the banner printer by interact() still goes to the JVM's > > > System.err (which is shared by all sessions and goes to a log file). Is it > > > necessary to virtualize System.err, or should I just > > > keep overriding write(String) as well? > > > > Sorry, if the problem is just the banner I think this further change should > > fix the problem > > > > > > public InteractiveConsole2() { > > > > super(); > > > > this.systemState = new org.python.core.PySystemState(); > > this.setState(); > > > > } > > > > regards. > > Nope. Banner still goes to System.err unless I override write(). > Things are OK for now since overriding write() does the trick, but > I'll keep trying your suggestions if you are curious . . . admittedly I have not tried things and I was just reasoning on the code, it seems that I'm missing something, please report the problem InteractiveConsole2 (with its code) but still need to override write() to have banner printed in the right place as a bug to SF. Thanks. |