`
qzriso
  • 浏览: 242932 次
  • 性别: Icon_minigender_1
  • 来自: ph
社区版块
存档分类
最新评论

在.NET中嵌入IronPython 交互

    博客分类:
  • c#
阅读更多

随着IronPyhon 2.0 的发布,.NET Dynamic Language Runtime 也更加成熟了,在2.0中我们可以用动态脚本以粘合剂的方式编写架构体系中的各种逻辑单元,既便于修改,又能灵活适合多变的业务场景。当然,我的目标是在 Platform Framework 中能嵌入脚本引擎,而不是用 ipy.exe 去执行一个 "独立" 的任务。要让.net 项目能真正跟脚本进行交互,还得需要提供脚本引擎的实现。这得提到DLR一些基本 概念了。

下图摘自 DLR 帮助文件,通过它我们基本可以了解基于 DLR 的组成方式。

uploads/200812/18_155159_1.png

下图描述了 DLR 的基本执行流程。

uploads/200812/18_155213_2.png

  • ScriptRuntime : 创建 DLR 运行环境,这是整个执行过程的起始点,它表示一个全局的执行状态(比如程序集引用等等)。每个应用程序域(AppDomain)中可以启动多个 ScriptRuntime。
  • ScriptScope : 构建一个执行上下文,其中保存了环境及全局变量。宿主(Host)可以通过创建不同的 ScriptScope 来提供多个数据隔离的执行上下文。
  • ScriptEngine : DLR 动态语言(比如 IronPython) 执行类,可于解析和执行动态语言代码。
  • ScriptSource : 操控动态语言代码的类型,我们可以编译(Compile)、读取(Read Code Lines)或运行(Execute)代码。
  • CompiledCode : 调用 ScriptSource.Compile() 将源代码编译成 CompiledCode,这样多次执行就无需重复编译,从而提高执行性能。
  • ObjectOperations : 提供了相关方法,允许我们在宿主(Host)中操作 DLR 对象成员(Member)。

 现在我们来构建脚本引擎

当然我们必须加入IronPyhton提供的相关引用并导入命名空间

using IronPython.Hosting;
using IronPython.Compiler;
using IronPython.Runtime;
using Microsoft.Scripting;
using System.Runtime.Remoting;

  1. Hello World

    var py  =   @"
    def test():
    return ‘hello world~!’;
    print test();
    " ;
    var engine 
    =  Python.CreateEngine();
    var code 
    =  engine.CreateScriptSourceFromString(py, SourceCodeKind.Statements);
    code.Execute();
    输出: hello world~!
    注意:Python 对于源代码缩进的格式有严格要求。
  2. 给Python上下文提供变量
    var scope = engine.Runtime.Globals; //engine.Runtime.CreateScope();
    scope.SetVariable("x", 123);
  3. 读取Python上下文中的变量
    var x = scope.GetVariable<int>("x");
    可以看出 ScriptScope 可以在 Host 和 ScriptRuntime 间传递数据。
  4. 对象实例共享

    var py  =   @"
    o.X = o.X + 2;
    print o.X;
    " ;
    var engine 
    =  Python.CreateEngine();
    var code 
    =  engine.CreateScriptSourceFromString(py, SourceCodeKind.Statements);
    var scope 
    =  engine.Runtime.Globals;
    var o 
    =   new  Data { X  =   123  };
    scope.SetVariable(
    " o " , o);
    code.Execute(scope);
    Console.WriteLine(o.X);
    载入程序集并由ScriptRuntime管理
  5. 创建程序集test.dll

    namespace  My.Library
    {
      
    public   class  MyClass
      {
        
    public   int  Test( int  x)
        {
          
    return   ++ x;
        }
      }

    创建Host程序


    var py  =   @"
    import clr;
    from My.Library import MyClass;
    from System import Console;
    o = MyClass();
    x.X = o.Test(x.X);
    Console.WriteLine(x.X);
    " ;
    var engine 
    =  Python.CreateEngine();
    engine.Runtime.LoadAssembly(Assembly.GetAssembly(
    typeof ( int )));  //  mscorlib.dll
    engine.Runtime.LoadAssembly(Assembly.LoadFrom( " test.dll " ));  //  test.dll
    var code  =  engine.CreateScriptSourceFromString(py, SourceCodeKind.Statements);
    var scope 
    =  engine.Runtime.Globals;
    var x 
    =   new  Data { X  =   123  };
    scope.SetVariable(
    " x " , x);
    code.Execute(scope);
    Console.WriteLine(x.X);

    读取Python上下文对象实例属性


    var py  =   @"
    class Class1:
      def __init__(self):
        self.i = 100
      def inc(self):
        self.i=self.i+100
    o = Class1()
    " ;
    var o 
    =  scope.GetVariable( " o " );
    var i 
    =  engine.Operations.GetMember < int > (o,  " i " ); 

    读取Python上下文对象实例方法
    engine.Execute("o.inc()", scope); //已经在上下文环境中执行此对象方法

分享到:
评论

相关推荐

    IronPython-2.7.5.zip

    IronPython是Python编程语言的一个重要实现,特别是在.NET和Mono...安装"IronPython-2.7.5.msi"后,开发者可以开始编写Python脚本,与.NET组件交互,并在C#项目中嵌入Python代码,从而提升开发效率和项目的可维护性。

    IronPython.zip

    总之,"IronPython.zip"提供的C#与IronPython的集成示例对于C#开发者来说是一个极好的学习工具,它将帮助你理解如何在.NET应用中嵌入Python,从而充分利用Python的动态性和强大的科学计算库。通过实践这个示例,你将...

    C# IronPython 脚本引擎源码 + 例子

    3. **示例**:这些示例可能会展示如何在C#项目中嵌入IronPython脚本,如何执行Python代码,以及如何在Python脚本中调用.NET组件。 4. **测试套件**:用于验证IronPython的正确性和性能的测试用例,可以帮助开发者...

    IronPython in Action.7z

    11. **扩展与嵌入**:讲解如何创建自定义.NET组件供Python使用,以及如何在其他.NET程序中嵌入IronPython解释器。 12. **社区与资源**:提供IronPython社区的相关信息,包括论坛、文档、开源项目和持续集成平台等。...

    IronPython In Action

    - **宿主环境**:开发人员可以将IronPython作为脚本引擎嵌入到.NET应用程序中,这样可以在不离开.NET环境的情况下使用Python脚本来扩展应用程序的功能。 - **动态执行**:IronPython允许在运行时动态执行Python...

    CS调用IronPython文章对应源码

    1. **CSPython.cs**:这个文件很可能包含了一个名为CSPython的类,它是C#与IronPython交互的核心。在这个类中,开发者可能会设置IronPython运行时环境,加载Python脚本,以及定义如何从C#代码中调用和传递参数到...

    使用IronPython编写.NET应用程序脚本

    在实际应用中,IronPython可以用于创建自定义的工作流、数据处理逻辑,或者为GUI应用程序提供交互式控制台。例如,在ASP.NET中,你可以使用IronPython编写服务器端脚本,动态生成网页内容。另外,还可以利用Iron...

    使用C#将IronPython嵌入WPF中

    在本文中,我们将深入探讨如何使用C#将IronPython脚本引擎嵌入到Windows Presentation Framework (WPF)应用程序中,从而实现动态编程和交互性增强的功能。 IronPython是一种开源的Python实现,它允许在.NET ...

    ironPythonSamples:ironPython示例

    7. **脚本宿主**:IronPython可以作为脚本引擎嵌入到其他.NET应用中,这方面的示例可能涉及如何在C#或VB.NET应用中执行Python脚本。 8. **性能比较**:对比标准Python解释器(CPython)和IronPython的运行效率,...

    C# 调用python样例代码

    `IronPython`是C#调用Python的一个解决方案,它允许在.NET环境中运行Python代码,实现了两者之间的无缝对接。 标题"C# 调用python样例代码"表明我们将讨论如何在C#项目中嵌入Python功能。这通常用于利用Python的...

    C#调用Python实例

    1. **使用IronPython**:IronPython是一个.NET上的Python实现,可以直接嵌入到C#项目中。这样,你可以在C#代码中直接编写和执行Python代码,无需通过外部进程通信。但是,它可能不支持所有Python库,适用于简单交互...

    netCallpyFile.rar

    1. **使用IronPython**: IronPython是.NET上的一个Python实现,可以直接嵌入到C#应用中。它允许C#代码创建和运行Python脚本,就像调用.NET方法一样。这种方式方便快捷,但可能不支持所有Python库。 2. **通过进程...

    Python在其它语言中的应用研究.zip

    4. **Python与.NET框架集成**:IronPython是Python的一种实现,可以在.NET Framework上运行,使Python代码可以无缝地与C#、VB.NET等.NET语言交互。这在跨平台开发和利用.NET工具链时非常有用。 5. **Python与Web...

    Python笔记 王一婷 2018-2019 第二学期.doc

    Python的交互式界面有多种实现,如CPython(默认的Python解释器,使用C语言编写)、IPython(提供增强的交互式体验)、JPython(基于Java)、PyPy(追求速度的Python实现)、IronPython(在.NET框架下运行)。...

    Manning.DSLs.in.Boo.Domain.Specific.Languages.in.NET.Jan.2010

    8. 进阶主题:可能包括DSL与其他技术的结合,如DSL与WPF、ASP.NET的交互,以及DSL在服务导向架构(SOA)中的作用。 通过阅读本书,读者不仅可以深入了解Boo语言,还能掌握构建DSL的方法和技巧,从而在自己的.NET...

    C#调用Python脚本的简单示例

    例如,如果一个项目大部分功能已经由Python脚本实现,而只需要添加用户界面时,就可以利用C#开发界面部分,然后通过IronPython将Python脚本嵌入C#应用程序中,从而实现Python与C#的互操作。 一个简单的例子是,当你...

    python面试题3-1

    - IronPython:在.NET平台上运行,将Python代码编译为.NET字节码。 4. Python 3与Python 2的区别:文档提到了几个关键区别点,例如print函数在Python 3中需要加括号,在Python 2中则不加;Python 3默认使用Unicode...

    Python面试题及答案共50道.docx

    - IronPython:在.NET平台上运行,将Python代码编译为.NET字节码。 7. PEP8规范: - 使用4个空格缩进。 - 每行代码不超过79个字符。 - 分组导入,按标准库、第三方库和本地库顺序。 - 避免不必要的空格,正确...

    Python安装、配置图文详解.docx

    3. IronPython:使得Python可以融入.NET框架中。 4. PyPy:Python解释器本身也是用Python编写的,通常具有更快的执行速度。 安装Python在Windows上非常直观。你可以从Python官方网站下载最新版本的安装包,然后按照...

    python3-廖雪峰带标签完整版

    Python的官方实现版本是CPython,同时,还存在其他的实现版本,如Jython(运行在Java平台上)、IronPython(运行在.NET平台上)和PyPy(使用即时编译技术提升性能)。 Python语言拥有丰富的第三方库,这些库可以...

Global site tag (gtag.js) - Google Analytics