[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 

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

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', 
scope = engine.CreateScope()

*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