代码改变世界

[集成IronPython] 建立运行环境并运行脚本

  Colin Han  阅读(4643)  评论(6编辑  收藏  举报

动态类型语言(以下简称:"动态语言"),在10年前就已流行起来。JavaScript更是成为了WEB前台开发的事实标准。但它们进入普通开发人员的视野也就在近几年。随着Web2.0和敏捷开发方法论的兴起,动态语言的灵活高效的特性成为了它被更多项目选择和使用的理由。一些大型网站已开始使用动态语言来实现,其中,国内比较优秀的作品有“豆瓣”。微软更是不甘落后,建立了DLR(动态语言运行时)来吸引动态语言爱好者在其上实现动态语言。IronPython就是其主要成员之一。

在本系列文章中,我们将逐步实现一个自定义控件,实现类似IDE的Immediate窗口的功能。用户可以在其中输入和运行IronPython代码。 【返回目录



先我们需要建立一个运行环境,并确保能够在其上运行Python脚本。大家可以从这里下载可运行的源代码。

我们首先来看一下运行结果:(提示:目前该程序是通过Ctrl+Enter执行你输入的代码。下面的输出窗口是IDE的Output窗口)

第一个版本运行效果图
点击看大图

其中主要的代码如下:

复制代码
 1namespace DynamicLanguageConsole
 2{
 3    public partial class DLConsole : UserControl
 4    {
 5        public DLConsole()
 6        {
 7            InitializeComponent();
 8
 9            ScriptRuntimeSetup runtimeSetup = new ScriptRuntimeSetup(true);
10            this._runtime = ScriptRuntime.Create(runtimeSetup);
11            this._engine = this._runtime.GetEngine(typeof(PythonContext));
12            // 你亦可以使用下面的代码获得脚本引擎,但是,下面的方法可能会在未来版本被废弃
13            // this._engine = PythonEngine.CurrentEngine;
14            this._scope = this._engine.CreateScope();
15        }
 
16
17        ScriptRuntime _runtime;
18        ScriptEngine _engine;
19        ScriptScope _scope; 
20
21        public void Exec(string script)
22        {
23            _engine.CreateScriptSourceFromString(script, SourceCodeKind.Statements).Execute(_scope);
24        }
 
25    }

26}
复制代码

程序中,我们保存了三个局部变量,ScriptRuntim,ScriptEngine和ScriptScope。

脚本运行时(ScriptRuntime):Hosting动态语言的入口。通过这个对象,你可以获得脚本引擎。添加全局变量等。
脚本引擎(ScriptEngine):实现语言特定的脚本功能,例如:编译源代码。
脚本空间(ScriptScope):提供了脚本运行的空间,脚本将会把其中定义的对象和变量等存储与这个空间里。.NET CLR对象也可以通过这个对象和脚本进行对象的共享。在《第三章:添加CLR对象到运行环境》中我们将会使用这个对象。

下面的图也许可以帮助你了解他们之间的关系。

High Level Hosting Object Relation
点击看大图

我们需要做的,就是构造这样三个对象(程序中的10-14行),然后,使用脚本引擎来编译用户输入的源代码,并且让该代码在ScriptScope上运行(程序中的23行)。

好了,仅仅需要这样7行代码,你的应用程序就具有了执行动态语言的能力。接下来,要让控制台控件更象一个标准的Python控制台《第二章:实现IConsole接口》。敬请关注feedsky

免责声明:本系列文章,完全是我个人研读IronPython源代码后找到的实现方案,并未详细的研究过IronPython的相关官方文档。因此,并不保证符合微软DLR和IronPython的设计思路,亦不能保证在DLR和IronPython 2.0正式发布后能够继续使用。

编辑推荐:
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
阅读排行:
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· 【.NET】调用本地 Deepseek 模型
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
点击右上角即可分享
微信分享提示