public static void test4() { var engine = Python.CreateEngine(); var scope = engine.CreateScope(); engine.Runtime.LoadAssembly(Assembly.LoadFrom("LibforPython.dll")); string pythonscript = "from LibforPython import PythonLib\n" + "o = PythonLib()\n" + "res = o.Test(6,'add')\n"; engine.CreateScriptSourceFromString(pythonscript).Execute(scope); Console.WriteLine(scope.GetVariable("res")); }
运行以上程序即可。这个例子中,LibforPython.dll是在运行时才引入Python环境中的。对于预先已知的Python可能用到的接口,才用例三的办法更好些,对于预先无法预先定义或“遗忘”的接口,采用本例比较适合。
五、总结
将Python环境“寄宿”于C#环境,进而动态执行用户自定义的脚本,是应用可配置性、灵活性的一种体现(其他动态语言也可以这么做,以Ironpython比较简单)。这一过程包括以下三步:
var engine = Python.CreateEngine();
var scope = engine.CreateScope();
var source = engine.CreateScriptSourceFromString(“…”);
source.Execute(scope);
Python环境与宿主环境的交互(参数传入、传出),则通过ScriptScop的GetVariable和SetVariable进行。
下一个问题就是Python复杂数据类型与C#复杂数据类型的对应以及出错处理等,将在下一篇介绍。这里只把复杂数据类型的对应列出来。
C# Python
IronPython.Runtime.List ―――― List
IronPython.Runtime.SetCollection ――― Set
IronPython.Runtime.PythonDictionary ―― Dictionary