IronPython for C#(一)

一、导入 IronPython 包

  • IronPython:2.7.11
  • VS2019
  • .Net Framework:v4.7.2

打开NuGet包管理器,搜索 IronPython 

 

 

 二、C#中引用python

1.上下文执行

 建立 test.py 文件,并将下面代码写入:

res = m + n

def add(a,b):
    return a + b

上述代码在python中会执行失败,因为m和n没有定义,但是利用C#代码给m和n赋值是可以执行成功的


 通过创建脚本上下文获取py文件中的对象,有点像C#中反射

using System;
using Microsoft.Scripting.Hosting;
using IronPython.Hosting;
class Program
{
    static void Main(string[] args)
    {
        ScriptEngine pythEng = Python.CreateEngine();
        ScriptSource source = pythEng.CreateScriptSourceFromFile("test.py");
        ScriptScope scope = pythEng.CreateScope();
        scope.SetVariable("m", 5);    //传递值
        scope.SetVariable("n", 10);
        source.Execute(scope);

        dynamic t = scope.GetVariable("res");  //获取值

        Func<object, object, object> adder = scope.GetVariable<Func<object, object, object>>("add");  //获取函数
        object v = adder(2, 3);
    }

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

PS:不能在py文件中给a和b赋值,否则就会用该值进行计算 

2.动态对象执行

m = 1
n = 2
res = m + n

def add(a,b):
    return a + b

通过运行环境创建一个文件对象,该文件对象必须是可以成功执行的py文件 


using Microsoft.Scripting.Hosting;
using IronPython.Hosting;
class Program
{
    static void Main(string[] args)
    {
        ScriptRuntime pyRuntime = Python.CreateRuntime();
        //UseFile方法放回的是一个ScriptScope对象,但是赋值给动态对象就可以直接获取整个py的对象
        dynamic scope = pyRuntime.UseFile("test.py");
        dynamic res = scope.res;   //获取值
        dynamic addRes = scope.add(2, 3);  //执行函数
    }
}
  •  ScriptRuntime :创建了一个Python的运行环境

 

 

posted @ 2022-04-12 22:46  Bridgebug  阅读(141)  评论(0编辑  收藏  举报