小言_互联网的博客

IronPython for C#(一)

437人阅读  评论(0)

一、导入 IronPython 包

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

打开NuGet包管理器,搜索 IronPython 

 

 

 二、C#中引用python

1.上下文执行

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


  
  1. res = m + n
  2. def add(a,b):
  3. return a + b

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


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


  
  1. using System;
  2. using Microsoft.Scripting.Hosting;
  3. using IronPython.Hosting;
  4. class Program
  5. {
  6. static void Main(string[] args)
  7. {
  8. ScriptEngine pythEng = Python.CreateEngine();
  9. ScriptSource source = pythEng.CreateScriptSourceFromFile( "test.py");
  10. ScriptScope scope = pythEng.CreateScope();
  11. scope.SetVariable( "m", 5); //传递值
  12. scope.SetVariable( "n", 10);
  13. source.Execute(scope);
  14. dynamic t = scope.GetVariable( "res"); //获取值
  15. Func< object, object, object> adder = scope.GetVariable<Func< object, object, object>>( "add"); //获取函数
  16. object v = adder( 2, 3);
  17. }
  18. }
  • ScriptEngine: 动态语言(IronPython)执行类,可于解析和执行动态语言代码。
  • ScriptScope:构建一个执行上下文,其中保存了环境及全局变量;宿主(Host)可以通过创建不同的 ScriptScope 来提供多个数据隔离的执行上下文。
  • ScriptSource:操控动态语言代码的类型,可以编译(Compile)、运行(Execute)代码。

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

2.动态对象执行


  
  1. m = 1
  2. n = 2
  3. res = m + n
  4. def add(a,b):
  5. return a + b

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



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

 

 


转载:https://blog.csdn.net/breakbridge/article/details/115953753
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场