[IronPython] Question on Multiple Discrete IronPython sessions in a single process

Michael Foord fuzzyman at voidspace.org.uk
Thu Apr 30 09:46:43 PDT 2009


Dino Viehland wrote:
> And this works for me:
>   

I just did the equivalent, from *inside* IronPython which may make a 
difference, with the 'os' module and got the opposite result:

 >>> import clr
 >>> clr.AddReference('IronPython')
 >>> from IronPython.Hosting import Python#
 >>> e1 = Python.CreateEngine()
 >>> e2 = Python.CreateEngine()
 >>>
 >>> os1 = Python.ImportModule(e1, 'os')
 >>> os2 = Python.ImportModule(e2, 'os')
 >>>
 >>> os1
<Microsoft.Scripting.Hosting.ScriptScope object at 0x000000000000002B 
[Microsoft
.Scripting.Hosting.ScriptScope]>
 >>> os1 is os2
False
 >>> os1.SetVariable('foo', 'bar')
 >>> os2.GetVariable('foo')
'bar'
 >>>


All the best,

Michael

> using System;
> using IronPython.Hosting;
> using Microsoft.Scripting.Hosting;
>
> class foo {
>         static void Main(string[] args)
>         {
>             var engine = Python.CreateEngine();
>             ScriptScope scope1 = engine.ImportModule("foo");
>             
>             var engine2 = Python.CreateEngine();
>             ScriptScope scope2 = engine2.ImportModule("foo");
>             
>             scope1.SetVariable("foo", 42);
>             object res;
>             if(scope2.TryGetVariable("foo", out res)) {
>                 Console.WriteLine(res);
>             } else {
>                 Console.WriteLine("no foo");
>             }
>         }
>     }
>
> Foo.py:
> print 'hello'
>
> Printing out:
>
> hello
> hello
> no foo
>
>   
>> -----Original Message-----
>> From: users-bounces at lists.ironpython.com [mailto:users-
>> bounces at lists.ironpython.com] On Behalf Of Michael Foord
>> Sent: Thursday, April 30, 2009 9:08 AM
>> To: Discussion of IronPython
>> Subject: Re: [IronPython] Question on Multiple Discrete IronPython
>> sessions in a single process
>>
>> Dino Viehland wrote:
>>     
>>> You mention CreateEngine but are you also creating multiple runtimes?
>>> You're only allowed 1 ScriptEngine of a given type per ScriptRuntime.
>>> So you should create a new ScriptRuntime and then get the Python
>>> engine for each runtime and then be isolated.
>>>
>>>       
>> If you call Python.CreateEngine() twice it gives you two different
>> engine objects with what *appear* to be different runtimes.
>>
>> If you then call Python.ImportModule for the same module but passing in
>> the two different engines, you get two different (non-identical
>> objects)
>> ScriptScopes - but changes in one are reflected in the other.
>>
>> Is CreateEngine not the correct way to get isolated engines?
>>
>> Michael
>>
>>     
>>> *From:* users-bounces at lists.ironpython.com
>>> [mailto:users-bounces at lists.ironpython.com] *On Behalf Of *Lepisto,
>>> Stephen P
>>> *Sent:* Thursday, April 30, 2009 8:26 AM
>>> *To:* users at lists.ironpython.com
>>> *Subject:* [IronPython] Question on Multiple Discrete IronPython
>>> sessions in a single process
>>>
>>> Hello, everyone!
>>>
>>> I am working on an service manager application that provides embedded
>>> python support through a small set of generalized classes:
>>> PythonService, PythonSession, and PythonClass. A client application
>>> asks the service manager for the PythonService object and then asks
>>> the PythonService object for a new PythonSession object. The
>>> PythonSession object is used to access embedded python through a
>>>       
>> small
>>     
>>> set of generalized methods. The PythonClass object is used to wrap a
>>> python class instance.
>>>
>>> The key requirement in this is each client must have its own python
>>> session, independent of any other sessions currently running. I've
>>>       
>> got
>>     
>>> this to work with CPython (specifically, python 2.5.4), by careful
>>>       
>> use
>>     
>>> of the global interpreter lock and swapping the thread state.
>>> IronPython 2.0.1 has a nicer way of implementing all of this by using
>>> the CreateEngine() to create a new python engine. However, in
>>> IronPython I've run into what appears to be a significant limitation
>>> that may prevent me from using IronPython in this particular
>>>       
>> situation
>>     
>>> as an embedded language.
>>>
>>> The limitation is when I import a python package from disk into
>>> IronPython (using IronPython.Hosting.Python.ImportModule()) in one
>>> session and then import the same package into a different session, it
>>> turns out that both sessions are pulling from the same module's
>>>       
>> scope.
>>     
>>> That is, if I make changes to the module's scope in one session (for
>>> example, changing a global variable), that change appears in the
>>>       
>> other
>>     
>>> session.
>>>
>>> After tracing execution in the IronPython 2.0.1 code, it turns out
>>> that a module is cached in the LanguageContext (PythonContext)
>>>       
>> object,
>>     
>>> which in turn is a singleton in DLR, as it is associated with the
>>> language type. This is okay if an application is embedding IronPython
>>> itself but in my scenario, this prevents multiple discrete python
>>> sessions in a single application. Ideally, I would expect to see the
>>> system state be stored in the python engine (ScriptEngine) or python
>>> runtime (ScriptRuntime) objects.
>>>
>>> Is there a way around this limitation? Can I somehow create a unique
>>> PythonContext object for each of my python sessions so I get a
>>> completely discrete python instance in each session with no
>>>       
>> crosstalk?
>>     
>>> Or do I have to resort to modifying the IronPython source to
>>> accomplish this (which I'm loathe to do since then I would have to
>>> maintain it going forward)?
>>>
>>> Thank you for your time and consideration in this matter.
>>>
>>> ---------------------------------------------------------------------
>>>       
>> ---
>>     
>>> _______________________________________________
>>> Users mailing list
>>> Users at lists.ironpython.com
>>> http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
>>>
>>>       
>> --
>> http://www.ironpythoninaction.com/
>>
>> _______________________________________________
>> Users mailing list
>> Users at lists.ironpython.com
>> http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
>>     
>
> _______________________________________________
> Users mailing list
> Users at lists.ironpython.com
> http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
>   


-- 
http://www.ironpythoninaction.com/



More information about the Users mailing list