[IronPython] How to place static class in script name space

Keith Rome rome at Wintellect.com
Mon Jun 13 20:25:54 CEST 2011


To pre-load various module imports into our execution environment, I am doing something like this at application startup (we have a number of modules that we pre-load):

    dynamic builtin = Engine.GetBuiltinModule();
    dynamic import = builtin.__import__;
    var DefaultImports = new string[] { "math", "clr", "sys", "string", "cmath", "re" /*etc...*/ };
    CachedModules = new Dictionary<string, PythonModule>();
    foreach (var mod in DefaultImports)
        CachedModules.Add(mod, import(mod));

And then later on, just before executing a new script each time, I create a new empty scope using Engine.CreateScope() and then I inject all of the cached modules that were previously imported:

    foreach (var mod in CachedModules)
        LocalScope.SetVariable(mod.Key, mod.Value);
    PreCompiled.Execute(LocalScope);

This allows each script invocation to reside in its own somewhat isolated sandbox, while only importing those commonly used modules once.

You should be able to do something similar to the above, using the builtin __import__() function. From looking over the IronPython source, it looks like you should be able to call it like this (I haven't tested it in this way, but I believe it should work):

    dynamic AppModule = import("App", null, null, "AppFrame");

This should effectively mimic exactly what happens when you run the statement "from AppFrame import App".


Many Bothan spies have died in bringing you this information.



Keith Rome
Senior Consultant and Architect
MCPD-EAD, MCSD, MCDBA, MCTS-WPF, MCTS-TFS, MCTS-WSS
Wintellect | 770.617.4016 | krome at wintellect.com<mailto:rome at wintellect.com>
www.wintellect.com<http://www.wintellect.com/>

From: users-bounces at lists.ironpython.com [mailto:users-bounces at lists.ironpython.com] On Behalf Of Dino Viehland
Sent: Monday, June 13, 2011 1:22 PM
To: Discussion of IronPython
Subject: Re: [IronPython] How to place static class in script name space

We specifically allow from staticclass import * because we treat a static class as if it were like a module.  So you could simply run that line of code in the scope on behalf of the user.  Otherwise you'll need to re-create getting the dynamic members and then setting them in the scope.  Then you can use PythonOps.GetAttrNames to get the defined names and finally PythonOps.GetBoundAttr to get the actual members which you'll then set in the scope.

From: users-bounces at lists.ironpython.com [mailto:users-bounces at lists.ironpython.com] On Behalf Of Tom Unger
Sent: Monday, June 13, 2011 10:16 AM
To: 'users at lists.ironpython.com'
Subject: [IronPython] How to place static class in script name space

I am using IronPython for scripting an application.  To make writing scripts easier I want to place several objects in the script name space so they can be easily used.  I got stuck with how to place a reference to a static object, "App", in the name space.  This is probably a simple operation and just don't know what it is.

1. Python import works:

            from AppFrame import App

gives the script access to the static fields and methods on App.

But I want to eliminate the need for each script to do that import by setting up the scope with:

   scriptScope.SetVariable("App", App);
This does not compile because App is a static class, not an object.

How does my hosing application place a reference to the static class in the script's scope such that it can be used as if it was imported?

Thanks

Tom
Seattle

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/ironpython-users/attachments/20110613/efb37b99/attachment.html>


More information about the Ironpython-users mailing list