zoukankan      html  css  js  c++  java
  • 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和底层,用脚本写逻辑...

  • 相关阅读:
    解题报告:luogu P1156
    解题报告:AT3605
    矩阵乘法与斐波那契数列
    九、模块
    八、异常
    七、文件处理
    六、对象和内存分析
    五、函数和内存分析
    四、控制语句
    三、序列
  • 原文地址:https://www.cnblogs.com/hydonlee/p/1495474.html
Copyright © 2011-2022 走看看