在.Net托管的IronPython脚本中设置和获取变量

时间:2014-10-17 14:11:58

标签: .net ironpython

我正在尝试使用托管在.Net控制台应用程序中的IronPython来构建验证规则引擎。我已经将脚本剥离到了我认为的基础

var engine = Python.CreateEngine();
engine.Execute("from System import *");
engine.Runtime.Globals.SetVariable("property_value", "TB Test");
engine.Runtime.Globals.SetVariable("result", true);

var sourceScope = engine.CreateScriptSourceFromString("result = property_value != None and len(property_value) >= 3");
sourceScope.Execute();

bool result = engine.Runtime.Globals.GetVariable("result");

engine.Runtime.Shutdown();

但它无法检测到我认为已设置的全局变量。使用

执行脚本时失败
global name 'property_value' is not defined

但是我可以检查范围中的全局变量并且它们在那里 - 当我在调试器中运行时,该语句返回true

sourceScope.Engine.Runtime.Globals.ContainsVariable("property_value")

我是IronPython的新手,如果这是一个简单/明显的问题,请道歉。

这样做的一般动机是创建this kind of rules engine但使用后来的(最近的)IronPython版本,其中一些方法和签名已经改变。

2 个答案:

答案 0 :(得分:7)

以下是我为脚本提供变量的方法,然后选择结果:

        var engine = Python.CreateEngine();
        var scope = engine.CreateScope();
        scope.SetVariable("foo", 42);
        engine.Execute("print foo; bar=foo+11", scope);
        Console.WriteLine(scope.GetVariable("bar"));

答案 1 :(得分:2)

要添加到Pawal的答案中,以这种方式设置的变量不是" global"并且无法通过导入的功能访问。我从here了解到,这是如何使它们全球化并且可供所有人访问:

var engine = Python.CreateEngine();
engine.GetBuiltinModule().SetVariable("foo", 42);