Host Python in your application with IronPython 2.0.1(二): 互相访问

在第一篇中只是简单的创建了一个交互环境,这样还达不到我的目标,为了将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和底层,用脚本写逻辑...

posted @ 2009-06-03 16:43  东子1573  阅读(352)  评论(0编辑  收藏  举报