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和底层,用脚本写逻辑...

你可能感兴趣的:(application)