随着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); //已经在上下文环境中执行此对象方法
分享到:
相关推荐
主要介绍了使用IronPython把Python脚本集成到.NET程序中的教程,现在刚刚被微软开源的.NET重新成为业界热点、本文介绍了使Python和.NET交互的IronPython,需要的朋友可以参考下
IronPython官方文档中文档
ironPython是一种在.NET及Mono上的Python实现,由微软的Jim Hugunin所发起,是一个开源的项目,基于微软的DLR引擎,除去.NET,IronPython与Python并没有什么区别。它支持一个可交互的控制台,该控制台支持完全的动态...
串口通信其实没什么变化,唯一变化的就是协议。在vb.net中通过IronPython执行Python脚本进行串口通信,就可以让程序使用各种不同的协议。希望对大家有帮助。
IronPython和C#交互的几种方式
.net 4.0的sharpdevelop4 IronPython ADDIN补丁。把补丁复制到sharpdevelop 4的Python Addin目录:C:\Program Files\SharpDevelop\4.4\AddIns\BackendBindings\PythonBinding\。也就是相应的补丁所在目录。无需注册...
Atom-ironpython-stubs.zip,通用ironpython/.net库的自动完成存根铁蟒树桩,atom是一个用web技术构建的开源文本编辑器。
IronPython 是一种在 NET 和 Mono 上实现的 Python 语言,由 Jim Hugunin(同时也是 Jython 创造者)所创造。1.0 版于2006年9月5日发布。随后,在 2007 年,开发者决定改写构架,使用动态类型系统以让更多脚本语言能...
IronPython2.7 , c#调用python用到的开发库, 是一种在 .NET 及 Mono上的 Python 实现,可以提高开发效率.
大名鼎鼎的IronPython,可以让 VS2010轻松调用 Python 脚本,需要 .net framework 4.0
IronPython开发工具
[Apress] IronPython 高级程序设计 (英文版) [Apress] Pro IronPython (E-Book) ☆ 出版信息:☆ [作者信息] Alan Harris [出版机构] Apress [出版日期] 2009年06月22日 [图书页数] 312页 [图书语言] 英语 ...
IronPython 开发环境2.7.5,较新版,运行在.net平台的Python实现
IronPython 是一种在 .NET 及 Mono上的 Python 实现,由微软的 Jim Hugunin 所发起,是一个开源的项目,基于微软的 DLR 引擎;
以下方法适用于让 Infer.NET(版本 2.6)与 IronPython(版本 2.9.0.0)和 Mono(版本 4.0.30319.17020)在 Ubuntu 14.04 上工作。 参考 主要基于这些非常有用的资源: [cs_blog]: ://crowdtheory.wordpress....
安装后在环境变量中的path添加ipy.exe所在的目录 然后在CMD中直接输入ipy就可以启动
IronPython 2.6 的源代码,用C#开发的。 是深入研究Python,深入学习C#的很好教材。 里面的设计思路很值得借鉴,强烈推荐
(c) 可以不断扩展添加python或.net开源dll,在python脚本中调用。 (3)命令行调用支持: IronPythonTest.exe -log logPath ;执行命令后输出日志全路径,默认Log目录 -py filePath ;执行python脚本全路径 -t ...
在.Net 写的项目要调用Python的一些方法完成特殊的操作,那么这就涉及到了,在.Net Framework中如何调用Python的脚本方法,通过IronPython完成了VB调用Python脚本方法