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的运行环境