zoukankan      html  css  js  c++  java
  • IronPython 与C#交互

    一、介绍

    Python是一种面向对象、直译式计算机程序设计语言,也是一种功能强大而完善的通用型语言,已经具有十多年的发展历史,成熟且稳定。这种语言具有非常简捷而清晰的语法特点,适合完成各种高层任务,几乎可以在所有的操作系统中运行。目前,基于这种语言的相关技术正在飞速的发展,用户数量急剧扩大,相关的资源非常多。 IronPython是由Jim Hugunin在微软领导开发的一个.NET平台上的Python实现,包括了完整的编译器、执行引擎与运行时支持,能够与.NET已有的库无缝整合到一起。微软对于.NET framework的IronPython和动态语言非常关注,已经在各种项目中提供了对IronPython的支持。IronPython已经很好的集成到了.NET framework中,Python语言中的字符串对应于.NET的字符串对象,并且Python语言中对应的方法,在IronPython中也都提供了。其它数据类型也是一样。

    作者

    参考:

    了解DLR: http://rednaxelafx.javaeye.com/blog/241430 

    jim的博客:http://blogs.msdn.com/hugunin/default.aspx

    http://developer.51cto.com/art/200910/156377.htm

    http://www.msuniversity.edu.cn/m_LearnCenterInfo/Detail.aspx?id=102

     二、基础知识

    1、安装

    因为我目前使用的是vs2008所以到http://ironpython.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=12482下载2.6正式版,我下的是IronPython-2.6.msi ,直接安装就行了。默认的安装路径应该是C:\Program Files\IronPython 2.6

    2、引入相应的dll

    创建一个控制台应用程序,然后到C:\Program Files\IronPython 2.6中引用IronPython.dll,Microsoft.Scripting.Core.dll,Microsoft.Scripting.dll三个dll。

    3、应用

    C:\Program Files\IronPython 2.6\Tutorial\Tutorial.htm是IronPython的应用指导,写的很仔细。ipy.exe是IronPython 的运行控制台,如果你想学习IronPython 的语法可以使用这个工具。IronPython 的语法这里就不详细介绍了,如果想进一步学习,可以下载IronPython in Action

    三、IronPython 与C#交互

    1、C#使用IronPython 代码

    我们希望在C#中直接运行IronPython 中的代码,比方说1+2的结果值

    代码
    ScriptEngine engine = Python.CreateEngine();
    ScriptScope scope 
    = engine.CreateScope();
    var strExpression 
    = "1+2";
    var sourceCode 
    = engine.CreateScriptSourceFromString(strExpression);
    var actual 
    = sourceCode.Execute<int>();
    Console.WriteLine(actual);

     执行结果:

    3

    ScriptEngine和ScriptScope是在.net中使用IronPython 脚本的两个基础类,ScriptSource是运行IronPython 的基础类,这里边sourceCode就是一个ScriptSource。

    有时我们希望给IronPython 代码中传入一个变量值

    代码
    ScriptEngine engine = Python.CreateEngine();
    ScriptScope scope 
    = engine.CreateScope();
    var strExpression 
    = "\"Hello:\" + str";
    var sourceCode 
    = engine.CreateScriptSourceFromString(strExpression);
    scope.SetVariable(
    "str""Python");
    var actual 
    = sourceCode.Execute<string>(scope);
    scope.RemoveVariable(
    "str");
    Console.WriteLine(actual);

    执行结果:

    Hello:Python

    2、C#调用IronPython 函数

    调用IronPython 中的MyFunction函数

    代码
    var strExpression = @"
    def MyFunction(n):
        return 2*n 
                    
    ";
                var sourceCode 
    = engine.CreateScriptSourceFromString(strExpression).Compile().Execute(scope);

                var func 
    = engine.GetVariable<Func<intint>>(scope, "MyFunction");

                Console.WriteLine(func(
    3));

    这里需要注意def MyFunction(n):前不能有空格,return 2*n 必须有空格

     3、IronPython 调用C#函数

    在IronPython 中调用C#中已经存在的函数

    代码
    static void Main(string[] args)
            {
                ScriptEngine engine 
    = Python.CreateEngine();
                ScriptScope scope 
    = engine.CreateScope();
                var strExpression 
    = "CMethod('Python')";
                var sourceCode 
    = engine.CreateScriptSourceFromString(strExpression);
                scope.SetVariable(
    "CMethod", (Func<stringstring>)TMethod);
                var actual 
    = sourceCode.Execute<string>(scope);
                scope.RemoveVariable(
    "CMethod");
                Console.WriteLine(actual);
            }
            
    public static string TMethod(string info)
            {
                
    return "Hello:" + info;
            }

     如果需要使用某个对象中的某个函数

    代码
     Test test = new Test();
                var strExpression 
    = @"
    test.Hello()
    ";
                var sourceCode 
    = engine.CreateScriptSourceFromString(strExpression);
                scope.SetVariable(
    "test", test);
                var actual 
    = sourceCode.Execute<string>(scope);
                Console.WriteLine(actual);

      

    如果需要在IronPython 实例化使用某个对象,就稍微复杂点,这里我们创建了一个IronPythonTest程序集,我们希望在IronPython代码中使用IronPythonTest程序集中的Test类,代码如下:

    代码
    var strExpression = @"
    import clr, sys
    clr.AddReference('IronPythonTest')
    from IronPythonTest import *
    test=Test()
    test.Hello()
                
    ";
                var sourceCode 
    = engine.CreateScriptSourceFromString(strExpression);
                var actual 
    = sourceCode.Execute<string>(scope);
                Console.WriteLine(actual);

    Test代码:

    namespace IronPythonTest
    {
        
    public class Test
        {
            
    public string Hello()
            {
                
    return "Hello World";
            }
        }
    }

      

    clr.AddReference('IronPythonTest')是用来添加程序集的

    from IronPythonTest import *是用来添加命名空间的

    参考:

    http://www.236z.com/html/30/6/9/2009/11/10/67471.html

    IronPython和C#执行速度对比

  • 相关阅读:
    RocketMQ 概念
    CentOS7使用firewalld管理防火墙
    java应用启动报错Unable to access jarfile xxxxx.jar
    docker启动redis并设置密码
    sql优化整理(二)
    sql优化整理(一)
    dubbo配置的覆盖关系
    dubbo配置加载优先级
    ZooKeeper的数据模型
    leetcode104:permutations
  • 原文地址:https://www.cnblogs.com/nuaalfm/p/1667448.html
Copyright © 2011-2022 走看看