在第一篇中只是简单的创建了一个交互环境,这样还达不到我的目标,为了将python整合进应用,还需要让python和我们的.net应用互相可以访问.
在IronPython Alpha1中,是有一个CHM文档的,下载了正式版之后,居然找不到了...在maillist中问了之后才知道, 原来搞了份DOC档,放在http://dlr.codeplex.com/. 下载之后才发现是专门讲HOST的,真爽(下载页面看这里).
今天的任务比较简单, 向python引擎中放一个简单变量a, 然后用python修改它, 再读回来,代码如:
public void Run1() { helper.DefaultScope.SetVariable("a", 1); helper.Execute("print 'visit a in python: ', a"); helper.Execute("print 'modify a into 2'"); helper.Execute("a=2"); object a = helper.DefaultScope.GetVariable("a"); helper.PrintLn("get a from python", a); }
helper是自己整理了一个专门用于初始化环境并执行python语句的类,以后希望可以逐步整理,并用在以后的应用中.代码如下:
using System; using System.Collections.Generic; using System.Text; using Microsoft.Scripting.Hosting; using IronPython.Hosting; namespace AccessEach { ////// IronPython Helper /// public sealed class IPHelper { #region private private IPHelper() { _defaultEngine = Python.CreateEngine(); _defaultScope = _defaultEngine.CreateScope(); } private ScriptEngine _defaultEngine ; private ScriptScope _defaultScope ; private static IPHelper _helper = new IPHelper(); public static IPHelper Instance { get { return _helper; } } #endregion #region IronPython functions ////// Get the Default python Engine /// public ScriptEngine DefaultEngine { get { return _defaultEngine; } } ////// default scrope of default engin /// public ScriptScope DefaultScope { get { return _defaultScope; } } public object Execute(string cmd, ScriptScope scope, ScriptEngine engine) { ScriptSource source = engine.CreateScriptSourceFromString(cmd, Microsoft.Scripting.SourceCodeKind.Statements); return source.Execute(scope); } public object Execute(string cmd, ScriptScope scope) { return this.Execute(cmd, scope, _defaultEngine); } public object Execute(string cmd) { return this.Execute(cmd, _defaultScope, _defaultEngine); } #endregion #region 输入输出 public void Print(params object[] objs) { foreach (object o in objs) { Console.Write(o); } } public void PrintLn(params object[] objs) { foreach (object o in objs) { Console.WriteLine(o); } } #endregion } }
执行Run1(), 发现我的目的达到了. 我的.net程序和脚本实现了最简单的交互.
下一篇预告:这样写很无聊,写一个简单的游戏玩一下...用.net做UI和底层,用脚本写逻辑...