[IronPython] IronPython 2: Oddity with Hosting API from within IronPython

Michael Foord michael.foord at resolversystems.com
Fri Oct 31 14:53:45 CET 2008


Hello guys,

In Resolver One we use the IronPython hosting API from inside IronPython 
code. I've noticed an oddity that is not how I would expect the hosting 
API to behave if I was using it from C#.

My understanding is that the correct way to publish a module (make it 
available for a ScriptEngine to import) is to set it in 
'engine.Runtime.Globals'.

If I do this from within IronPython code with a module I have already 
imported and then execute an import statement in the engine, the module 
is re-imported (code executed) rather than using the one I have 
published to the runtime globals.

If I have a 'foobar' module that prints when importing, the following 
code prints twice instead of the once I would expect:

import sys
import clr
clr.AddReference('IronPython')
clr.AddReference('Microsoft.Scripting')

from IronPython.Hosting import Python
from Microsoft.Scripting import SourceCodeKind

import foobar

engine = Python.CreateEngine()
engine.Runtime.Globals.SetVariable('foobar', sys.modules['foobar'])

source = engine.CreateScriptSourceFromString('import foobar\r\n', 
SourceCodeKind.Statements)
scope = engine.CreateScope()
source.Compile().Execute(scope)


*However*, if I change the code to not use Runtime.Globals, but instead 
do the following, then the module is only imported once and I get one 
print as expected:

hostedSys = Python.GetSysModule(engine)
hostedSys.modules['foobar'] = sys.modules['foobar']

Is there something I have overlooked here?

As a minor supplementary question, how do I get a reference to the 
default ScriptScope on an engine? Is there any performance advantage in 
using the default one, can I replace it, and does replacing it remove 
any performance benefits we might have got? (OK, so strictly speaking 
that wasn't just one question...)

All the best,

Michael Foord

-- 
Michael Foord
Senior Software Engineer, Resolver Systems Ltd.
michael.foord at resolversystems.com
+44 (0) 20 7253 6372

Try out Resolver One! <http://www.resolversystems.com/get-it/>

17a Clerkenwell Road, London EC1M 5RD, UK
VAT No.: GB 893 5643 79 Registered in England and Wales as company number 5467329.
Registered address: 843 Finchley Road, London NW11 8NA, UK 




More information about the Ironpython-users mailing list