一、导入 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的运行环境
转载:https://blog.csdn.net/breakbridge/article/details/115953753
查看评论