分享
 
 
 

在.NET中嵌入IronPython 交互

王朝学院·作者佚名  2009-11-04
窄屏简体版  字體: |||超大  

随着IronPyhon 2.0 的发布,.NET Dynamic Language Runtime 也更加成熟了,在2.0中我们可以用动态脚本以粘合剂的方式编写架构体系中的各种逻辑单元,既便于修改,又能灵活适合多变的业务场景。当然,我的目标是在 Platform Framework 中能嵌入脚本引擎,而不是用 ipy.exe 去执行一个 "独立" 的任务。要让.net 项目能真正跟脚本进行交互,还得需要提供脚本引擎的实现。这得提到DLR一些基本 概念了。

下图摘自 DLR 帮助文件,通过它我们基本可以了解基于 DLR 的组成方式。

下图描述了 DLR 的基本执行流程。

ScriptRuntime: 创建 DLR 运行环境,这是整个执行过程的起始点,它表示一个全局的执行状态(比如程序集引用等等)。每个应用程序域(AppDomain)中可以启动多个 ScriptRuntime。

ScriptScope: 构建一个执行上下文,其中保存了环境及全局变量。宿主(Host)可以通过创建不同的 ScriptScope 来提供多个数据隔离的执行上下文。

ScriptEngine: DLR 动态语言(比如 IronPython) 执行类,可于解析和执行动态语言代码。

ScriptSource: 操控动态语言代码的类型,我们可以编译(Compile)、读取(Read Code Lines)或运行(Execute)代码。

CompiledCode: 调用 ScriptSource.Compile() 将源代码编译成 CompiledCode,这样多次执行就无需重复编译,从而提高执行性能。

ObjectOperations: 提供了相关方法,允许我们在宿主(Host)中操作 DLR 对象成员(Member)。

现在我们来构建脚本引擎

当然我们必须加入IronPyhton提供的相关引用并导入命名空间

using IronPython.Hosting;

using IronPython.Compiler;

using IronPython.Runtime;

using Microsoft.Scripting;

using System.Runtime.Remoting;

Hello World

Code

var py = @"

def test():

return ‘hello world~!’;

print test();";

var engine = Python.CreateEngine();

var code = engine.CreateScriptSourceFromString(py, SourceCodeKind.Statements);

code.Execute();

输出: hello world~!

注意:Python 对于源代码缩进的格式有严格要求。

给Python上下文提供变量

var scope = engine.Runtime.Globals; //engine.Runtime.CreateScope();

scope.SetVariable("x", 123);

读取Python上下文中的变量

var x = scope.GetVariable<int>("x");

可以看出 ScriptScope 可以在 Host 和 ScriptRuntime 间传递数据。

对象实例共享

Code

var py = @"

o.X = o.X + 2;

print o.X;";

var engine = Python.CreateEngine();

var code = engine.CreateScriptSourceFromString(py, SourceCodeKind.Statements);

var scope = engine.Runtime.Globals;

var o = new Data { X = 123 };

scope.SetVariable("o", o);

code.Execute(scope);

Console.WriteLine(o.X);

载入程序集并由ScriptRuntime管理

创建程序集test.dll

namespace My.Library

{

public class MyClass

{

public int Test(int x)

{

return ++x;

}

}

}

创建Host程序

Code

var py = @"

import clr;

from My.Library import MyClass;

from System import Console;

o = MyClass();

x.X = o.Test(x.X);

Console.WriteLine(x.X);";

var engine = Python.CreateEngine();

engine.Runtime.LoadAssembly(Assembly.GetAssembly(typeof(int))); // mscorlib.dll

engine.Runtime.LoadAssembly(Assembly.LoadFrom("test.dll")); // test.dll

var code = engine.CreateScriptSourceFromString(py, SourceCodeKind.Statements);

var scope = engine.Runtime.Globals;

var x = new Data { X = 123 };

scope.SetVariable("x", x);

code.Execute(scope);

Console.WriteLine(x.X);

读取Python上下文对象实例属性

Code

var py = @"

class Class1:

def __init__(self):

self.i = 100

def inc(self):

self.i=self.i+100

o = Class1()";

var o = scope.GetVariable("o");

var i = engine.Operations.GetMember<int>(o, "i");

读取Python上下文对象实例方法

engine.Execute("o.inc()", scope); //已经在上下文环境中执行此对象方法

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有