我正在尝试使用托管在.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版本,其中一些方法和签名已经改变。
答案 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);