• C#Note13:如何在C#中调用python


     前言

    IronPython 是一种在 .NET 及 Mono上的 Python 实现,由微软的 Jim Hugunin(同时也是 Jython 创造者) 所发起,是一个开源的项目,基于微软的 DLR 引擎。在 2007 年,开发者决定改写构架,使用动态类型系统以让更多脚本语言能很容易地移植到NET Framework上。IronPython 的官方并未实现 Python 通用类库,仅实现了部分核心类,社区的开源类库实现有:

    fepy(http://fepy.sourceforge.net/):fepy 为 IronPython 提供 Python 的大多数通用类库的实现。

    Test For IronPython

    (1)在VS2017中新建窗体项目:IronPythonTest.

    (2)VS菜单栏工具中打开“Nuget程序包管理器”:

    (3)搜索IronPython程序包并安装:

     (4)安装成功后,在exe程序所在文件夹下(也可以在其他目录下,通过指定相对路径),创建Python脚本:

    示例(实现求两个数的四则运算)

    num1=arg1  
    num2=arg2  
    op=arg3  
    if op==1:  
        result=num1+num2  
    elif op==2:  
        result=num1-num2  
    elif op==3:  
        result=num1*num2  
    else:  
        result=num1*1.0/num2  
    

    (5)修改工程的配置文件App.config:

     

    (6)计算按钮的点击事件:

    private void btnCalculate_Click(object sender, EventArgs e)
    {
    ScriptRuntime scriptRuntime = ScriptRuntime.CreateFromConfiguration();
    ScriptEngine rbEng = scriptRuntime.GetEngine("python");
    ScriptSource source = rbEng.CreateScriptSourceFromFile("hello.py");
    ScriptScope scope = rbEng.CreateScope();
    
    try
    {
    //设置参数 
    scope.SetVariable("arg1", Convert.ToInt32(txtNum1.Text));
    scope.SetVariable("arg2", Convert.ToInt32(txtNum2.Text));
    scope.SetVariable("arg3", operation.SelectedIndex + 1);
    }
    catch (Exception)
    {
    MessageBox.Show("输入有误。");
    }
    
    source.Execute(scope);
    labelResult.Text = scope.GetVariable("result").ToString();
    }  

    其中,我们需要使用的类型:

    • ScriptEngine: 动态语言(IronPython)执行类,可于解析和执行动态语言代码。
    • ScriptScope:构建一个执行上下文,其中保存了环境及全局变量;宿主(Host)可以通过创建不同的 ScriptScope 来提供多个数据隔离的执行上下文。
    • ScriptSource:操控动态语言代码的类型,可以编译(Compile)、运行(Execute)代码。

    可参考相关文章:

    使用IronPython集成Python和.NET

    跨语言和跨编译器的那些坑(CPython vs IronPython)

    IronPython和C#交互(重点推荐)

  • 相关阅读:
    Arch 真好用
    Spring 自定义注解-字段注解
    Raft论文概述
    Raft成员变化(Membership Change)
    Reactor模式详解
    高性能IO之Reactor模式
    WinFrm中多线程操作窗体属性
    Reactor模式
    高并发中的线程与线程池
    二层交换机与三层交换机区别详解!
  • 原文地址:https://www.cnblogs.com/carsonzhu/p/7260699.html
Copyright © 2020-2023  润新知