初步了解IronPython

装了Ironpython还需要装Python吗?

----IronPython 是一种在 NET 和 Mono 上实现的 Python 语言,由 Jim Hugunin(同时也是 Jython 创造者)所创造.
IronPython是优雅的python编程语言和强大的.NET平台的有机结合。使用动态类型系统得以将Python移植到NET Framework上。
可以形象的说,Ironpython就像是Python的一种方言,所以装了Ironpython就已经是安装了Python了。

----Ironpython就是在Python.NET下的实现,CPython是C下的Python实现,都是同一个东东,所以装了Ironpython并不需要装Python,当然两者也可以共存。

----不需要,Ironpython就是.NET下实现的Python

使用IronPython集成Python和.NET   http://python.jobbole.com/80982/

本文由 伯乐在线 - 艾凌风 翻译,Daetalus 校稿。未经许可,禁止转载! 英文出处:www.informit.com。欢迎加入翻译组

从两个优秀的世界各取所需,更高效的复用代码。想想就醉了,.NET和python融合了。“懒惰”的程序员们,还等什么?

Jesse Smith为您展示如何两个语言来服务同一个.NET程序。你能集两家所长:Python和.NET一起工作,提供可重用的代码功能而不需要你为了一个环境重写代码库。

通过使用IronPython 运行时库,你可以让Python脚本运行在你的.NET程序中。本文向你展示如何使用一个.NET程序中的python脚本获取并展示用户反馈。

如果你曾经有在一个.NET程序中运行Python脚本的需求,整合两者最好的办法是使用IronPython。我有过这样的需求。我曾经效力的一个组织需要扩展一个已经存在于一个.NET地图程序中的工具集。我们的目的是利用另一个工具集中现有的Python代码来扩展这个已有的工具集,前者还不是后者的一部分。在做了一番研究之后,我决定使用IronPython,事情进展很顺利。

本文基于上述项目的经验,我会还原当时的场景,对你所处的情境也同样适用。

对于这个我们所期望的解决方案,首先要面对的挑战是从将要运行在.NET程序中的那个Python脚本获取输出,然后使用一个.NET程序的对话框把这个输出展示给用户。让我感到吃惊的是,这么做比预想的还要简单,你同样也能学到如何去做同样的事情。整个过程相对比较简单,我们将在下面的章节中进行概述。

在.NET程序中嵌入Python脚本

在这个例子中,我向你展示如何在一个Windows桌面程序中嵌入Python脚本。目的是在一个已有的程序中添加一个新的工具按钮。点击按钮后,程序会弹出一个对话框,显示一个嵌入在对话框代码中的Python脚本的运行结果。

为了给这个例子铺垫更多的前因后果,我们这个应用程序是一个桌面地图软件,可以让用户创建他们自己的地图。这个新的工具允许用户解析和标准化他们地图上的地址点。

标准化一个地址,就意味着要确保这个地址有一个街道名,前缀或后缀,房屋或建筑编号,以及连接该街道的上一条街道和下一条街道。每一个地址段必须遵循US邮局邮编地址标准指导。

假设已有一个Python脚本已经可以做到这些;它就是例子中执行解析的脚本。Python脚本将会通过当前对话框在屏幕上输出或闪现这个正在解析的地址,我们可以通过选择地址解析工具来触发对话框(我不想说的太细,仅仅解释到这里。)

代码并不重要,重要的是知道如何嵌入脚本和如何定向脚本的输出到对话框,作为程序的一部分显示在屏幕上。这一过程像下面这样进行:

  1. 用户启动地图程序并打开一个自定义地图。
  2. 用户从屏幕上方的已有的工具集中选择一个新的地址标准化工具。
  3. 弹出一个带有可以启动地址标准化进程的启动按钮的地址标准化对话框
  4. 一个文本框显示当前正在被解析的地址。这些文本框很快消失,地址在用户眼前一闪而过,表示过程启动并且正在解析。
  5. 出现一个表示整个过程结束的信息,使用了第4步中同样的文本框。

确定源代码和项目

首先要做的事情是确定脚本应该嵌入到应用程序源代码的什么位置。在我们的例子/情境下,这个位置应该是添加到包含工具集项目中的新的对话框。这个对话框会被一个已经存在的用于处理工具栏点击事件的方法所触发

当我们确定了需要包含源代码的项目后,就需要引用IronPython 库。

如果你使用Visual Studio作为编辑器的话,最简单的方法是使用Nuget Package Manager来添加IronPython库到项目中。你可以搜索”IronPython”,然后运行时库就可以在包管理工具中选择了。

嵌入脚本

接下来做的才是真正嵌入脚本。你首先要用脚本引擎(scripting engine)来设置一个Python脚本引擎实例。在添加脚本前,你同样可以设置任何你的脚本所需的特殊的路径。

Python

; html-script: false ]ScriptEngine pyEngine = Python.CreateEngine();
pyEngine.Runtime.IO.RedirectToConsole();
var paths = pyEngine.GetSearchPaths();
paths.Add(@"C:Python27Lib");
paths.Add(@"C:Python27Libsite-packages");
pyEngine.SetSearchPaths(paths);

1

2

3

4

5

6

; html-script: false ]ScriptEngine pyEngine = Python.CreateEngine();

pyEngine.Runtime.IO.RedirectToConsole();

var paths = pyEngine.GetSearchPaths();

paths.Add(@"C:Python27Lib");

paths.Add(@"C:Python27Libsite-packages");

pyEngine.SetSearchPaths(paths);

第二行告诉.NET框架Python引擎的运行时库会将输出重定向到控制台。然而,这并不是重定向到我们为这个应用添加的新的工具所需的对话框中。(下面的代码会做这个工作)

但是,首先我们需要通过一个简单的字符串变量来添加脚本。你需要改变你的脚本中的引号来配合字符串的引号工作。

一个简单的方法是把你脚本中的所有双引号变成单引号。嵌入脚本的语法如下:

Python

; html-script: false ]string thescript =
@"
(此处为实际脚本内容)
";

1

2

3

4

; html-script: false ]string thescript =

@"

(此处为实际脚本内容)

";

你可能需要处理一些格式问题,但是缩进必须一致。在脚本字符串解析一个有效的字符串后,是时候添加输出重定向代码让脚本的输出显示在工具的对话框窗口中了:

Python

; html-script: false ]Console.SetOut(TextWriter.Synchronized(new TextBoxWriter(statusText)));
pyEngine.Execute(thescript);
this.AllDone(FINISHED);
}
catch (Exception ex)
{
this.AllDone(ex.InnerException.StackTrace);
}
}
public void AllDone(string message)
{
buttonStart.Enabled = true;
this.statusLabel.Text = message;
}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

; html-script: false ]Console.SetOut(TextWriter.Synchronized(new TextBoxWriter(statusText)));

pyEngine.Execute(thescript);

this.AllDone(FINISHED);

}

catch (Exception ex)

{

this.AllDone(ex.InnerException.StackTrace);

}

}

public void AllDone(string message)

{

buttonStart.Enabled = true;

this.statusLabel.Text = message;

}

在上面这段代码中,我们设置了一个新的TextWriter,它接受一个TextBoxWriter类型的参数,这使得我们可以把脚本的输出重新写到一个文本框中。TextBoxWriter类型的代码如下:

Python

; html-script: false ]public class TextBoxWriter : TextWriter
{
private TextBox _textBox;
public TextBoxWriter(TextBox textbox)
{
_textBox = textbox;
}
public override void Write(char value)
{
base.Write(value);
// When character data is written, append it to the text box.
_textBox.AppendText(value.ToString());
}
public override System.Text.Encoding Encoding
{
get { return System.Text.Encoding.UTF8; }
}
}
}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

; html-script: false ]public class TextBoxWriter : TextWriter

{

private TextBox _textBox;

public TextBoxWriter(TextBox textbox)

{

_textBox = textbox;

}

public override void Write(char value)

{

base.Write(value);

// When character data is written, append it to the text box.

_textBox.AppendText(value.ToString());

}

public override System.Text.Encoding Encoding

{

get { return System.Text.Encoding.UTF8; }

}

}

}

传入TextBoxWriter类型的statusText属性是我们的文本框,它会出现在对话框中,显示脚本的输出。我们的Python脚本中的每一个输出语句都会被重定向到这个文本框。

结论

在本文中,你学会了如何把Python脚本集成到一个.NET程序中,并且把Python的脚本文件输出到一个.NET对话框。这种无缝衔接,用户是不会感觉到的,他们并不知道实际上是Python在处理后台的一些工作。

在很多场合下,集成两种语言是很有用的。我分享了的这一情景,为我的处境提供了很好的解决方案。你可以按照类似的步骤,用同样的方法把它应用在很多场合。

我建议你去建立一个自己的简单范例,甚至使用Python脚本文件把Python代码直接加入到.NET应用中,你确实可以这样做。当然你并不需要直接把脚本嵌入在.NET源代码中,但对我来说这样做最方便。

--------------------------------------------------------------------------------------

http://developer.51cto.com/art/200910/157697.htm

学习IronPython最简单的方法就是使用它,我们建议您下载安装IronPython 2.6。下载的安装程序包含了二进制文件、Python标准程序库、用于Silverlight的IronPython和一个教程。此外,还有一个成为Pyc.py的工具,该工具可以把IronPython应用程序编译成二进制文件。

Ipy.exe可以用来执行IronPython程序,对于熟悉Python语言及探索.NET程序集来说非常有用。在本文中,交互会话使用>>> 来表示。

  1. >>> from System import Array
  2. >>> help(Array.CreateInstance)
  3. Help on built-in function CreateInstance:
  4. CreateInstance(...)
  5. Array CreateInstance(Type elementType, Array[int] lengths)

五、与.NET的集成

IronPython本身是用C# 写成的。IronPython使用原生的.NET类型,例如IronPython中的字符串类型即.NET字符串类型,整数类型即Int32,等等。通过使用Python的导入手段,我们就能够访问.NET程序库和类。

在使用.NET framework时,通常要导入clr模块,该模块含有用来为程序集添加索引之类的函数。一旦为程序集添加了引用,我们就能够从该程序集的命名空间中导入类。下面以Windows Forms为例进行说明:

  1. >>> import clr
  2. >>> clr.AddReference(‘System.Windows.Forms‘)
  3. >>> from System.Windows.Forms import Application, Button, Form
  4. >>>
  5. >>> form = Form(Text="Hello World")
  6. >>> button = Button(Text="Click Me")
  7. >>> form.Controls.Add(button)
  8. >>>
  9. >>> def onClick(sender, event):
  10. ...     print ‘Ouch!‘
  11. >>> button.Click += onClick
  12. >>> Application.Run(form)
  13. Ouch!
  14. Ouch!

下面我们对上述代码中有关的Python语法做相应的介绍。

1. 这里通过Form和Button构造函数的关键字参数来设置有关属性。

2. 事件处理函数(onClick)是一个标准的Python函数,IronPython会在幕后调用按钮单击处理程序(EventHandler)。

注意,在Python中,语句结构是用缩排表示的,而不是花括号。onClick函数体相对于其声明来说,要做缩进处理。

六、Dir函数与help函数

在通过交互式解释器进行学习的时候,有两个函数非常有用,它们分别是dir与help函数。Dir(some_object)常用来返回一个对象的所有成员,它们会作为字符串列表返回,而在Python中,我们可以根据需要对列表进行过滤或分割处理。例如,这里我们将显示系统命名空间中所有以字母“I”开头的成员:

  1. >>> import System
  2. >>> for member in dir(System):
  3. ...     if member.startswith(‘I‘):
  4. ...         print member
  5. ...
  6. IAppDomainSetup
  7. IAsyncResult
  8. ICloneable
  9. IComparable
  10. IConvertible
  11. ICustomFormatter
  12. IDisposable
  13. IEquatable
  14. IFormatProvider
  15. IFormattable
  16. (and so on...)
  17. >>>

Help(some_object)函数能够为我们提供一个对象更为详细的信息。提供help函数,我们可以打印出对象的所有方法,并针对个别方法再次调用该函数以获取进一步的信息:


  1. >>> from collections import namedtuple
  2. >>> help(namedtuple)
  3. Help on function namedtuple in module collections:
  4. namedtuple(typename, field_names, verbose=False)
  5. Returns a new subclass of tuple with named fields.
  6. >>> Point = namedtuple(‘Point‘, ‘x y‘)
  7. >>> Point.__doc__                   # docstring for the new class
  8. ‘Point(x, y)‘
  9. >>> p = Point(11, y=22)             # instantiate with positional args or keywords
  10. >>> p[0] + p[1]                     # indexable like a plain tuple
  11. 33
  12. >>> x, y = p                        # unpack like a regular tuple

Collections模块是Python标准程序库的一部分,namedtuple是一个类制造厂,我们可以使用它新建其行为类似枚举类型(Python没有内建的枚举类型)的类:

  1. >>> from collections import namedtuple
  2. >>> Point = namedtuple(‘Point‘, ‘x y‘)
  3. >>> point = Point(1, 3)
  4. >>> point
  5. Point(x=1, y=3)
  6. >>> point.x
  7. 1
  8. >>> point.y
  9. 3

在运行时新建类是动态语言的优点之一。

七、设置sys.path

使用交互式解释器时,一个重要因素是当我们执行导入语句或者为程序集添加引用时,Python需要到哪里去查找。默认时,所有标准.NET框架都可以被引用。另外IronPython安装程序也包含有Python标准程序库。对于别的东西,我们需要告诉IronPython到哪里查找python模块和程序集。

Python用于查找python模块时,需要用到称为sys.path的系统模块中的一个Python列表。对于IronPython来说,当我们为程序集添加引用的时候,IronPython也是通过sys.path来指出到哪里去寻找程序集的。为了将一个新目录添加到搜索路径,只需将该路径作为字符串附加上去就行,具体如下所示:

  1. >>> import sys
  2. >>> path = ‘c:\\Projects\\MyProject‘
  3. >>> sys.path.append(path)
  4. >>> import clr
  5. >>> clr.AddReference(‘MyAssembly‘)

由于字符串中的反斜杠被用作转义字符使用,因此我们必须在路径中使用双反斜杠。

到这里,对于IronPython所需要了解的基础知识也介绍的差不多了。如果你对于在.NET平台上运行Python感兴趣,那么就来试试看IronPython吧!

时间: 2024-12-30 05:22:55

初步了解IronPython的相关文章

初步了解CPU

了解CPU By JackKing_defier 首先说明一下,本文内容主要是简单说明CPU的大致原理,所需要的前提知识我会提出,但是由于篇幅我不会再详细讲解需要的其他基础知识.默认学过工科基础课. 一.总述 先从计算机的结构说起,在现代计算机中,CPU是核心,常常被比喻为人的大脑.现在的计算机都为“冯·诺依曼机”,“冯诺依曼机”的一个显著的特点就是由运算器.存储器.控制器.输入设备和输出设备组成.CPU是运算器和控制器合起来的统称,因为运算器和控制器在逻辑关系和电路结构上联系十分紧密,尤其在大

zerglurker的C语言教程004——指针初步讲解

在上次的教程里面,我提到了指针. 针对指针,这次我将简单的讲讲,后面我还会讲到--那个时候你应该有了相当的基础. 首先,先讲讲指针类型. 任何类型关键字后面加一个*符号,就会变成指针类型. 比如: char → char* 字符指针 int → int* 整数指针 double→double* 双精度指针 甚至还可以这样: char*→char** 字符指针的指针类型 →char*** 字符指针的指针的指针类型- 指针本质上是一个内存地址值,该内存地址上存放的是相关类型的数值.但是void*指针

nodejs,webpack安装以及初步运用

nodejs安装: 1.下载:https://nodejs.org/en/download/ 2.安装node-v6.11.3-x64.msi文件,直接默认安装(next--): 3.验证是否完成安装:cmd 进入后输入命令 node -v  回车能得到nodejs版本号: 输入node 回车再输入console.log('aaaaa') 回车能正常显示输出. 这表示nodejs安装成功. webpack安装: 1.npm安装:在f盘新建文件夹webpack,在webpack文件夹建文件夹dem

Github 的注册教程和初步使用体验

我叫许晴,是网工143的学生,学号是1413042064,兴趣包括手绘,看书和手游.学习过c++和汇编语言课程,但在编程方面没什么独立实践经验. 我的Githup用户名是 XQ123 .下面是我在github的注册流程及初步使用体验. 我先搜索github,试了好几次才进去官网,但是在手机客户端注册的话比较好进.这是网页注册的界面.使用名不能设成中文,只能使用数字.字母和特殊符号,不能以短横线开头.如果设置的用户名有重复的话也不能设置 如果设置的用户名已经有人使用的话,也是不能设置的. 然后就是

Unity3D游戏开发初探—2.初步了解3D模型基础

一.什么是3D模型? 1.1 3D模型概述 简而言之,3D模型就是三维的.立体的模型,D是英文Dimensions的缩写. 3D模型也可以说是用3Ds MAX建造的立体模型,包括各种建筑.人物.植被.机械等等,比如一个大楼的3D模型图.3D模型也包括玩具和电脑模型领域. 互联网的形态一直以来都是2D模式的,但是随着3D技术的不断进步,在未来的时间里,将会有越来越多的互联网应用以3D的方式呈现给用户,包括网络视讯.电子阅读.网络游戏.虚拟社区.电子商务.远程教育等等.甚至对于旅游业,3D互联网也能

虚拟桌面技术的初步探讨

[文章标题]: 虚拟桌面技术的初步探讨  [文章作者]:  newjueqi  [作者邮箱]: [email protected][作者QQ号]: 190678908[编写语言]:VC++6.0[操作平台]: XP-SP2[作者声明]:感觉到这是一种非常有意思的技术,这篇就当成是学习笔记吧!本人只是感兴趣,没有其它目的,失误之处敬请给位大侠原谅! 本文曾发表于看学论坛http://bbs.pediy.com/showthread.PHP?t=82537                      

【Qt学习笔记】1.初步接触

一.前言 Qt是一个跨平台的C++图形面向对象的框架,今天开始学习并记录学习过程,希望通过这段时间的努力学会Qt的使用. 同时我也希望在学习的过程中对C++的各种特性有能深刻的认识. 此外,我在Qt初步的学习过程中,所用的环境应该是 VS2015 IDE 二.安装 官网下载Qt安装包和 Qt for VS addin,分别安装,并配置. 三.Hello World 接下来用Qt框架来完成第一个程序 首先打开VS,创建一个Qt工程 熟悉的C++界面,但Qt是有可视化界面的,点击解决方案管理器中的.

基于C/S架构的3D对战网络游戏C++框架 _05搭建系统开发环境与Boost智能指针、内存池初步了解

本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): 1.实现基本通信框架,包括对游戏的需求分析.设计及开发环境和通信框架的搭建: 2.实现网络底层操作,包括创建线程池.序列化网络包等: 3.实战演练,实现类似于CS反恐精英的3D对战网络游戏: 技术要点:C++面向对象思想.网络编程.Qt界面开发.Qt控件知识.Boost智能指针.STL算法.STL.

初步安装、使用PyPy

最近一周,一直在琢磨着怎么提高python的运行效率,前几天还写了一篇关于提高运行效率的博文,有兴趣的可以去看看,地址如下:http://11026142.blog.51cto.com/11016142/1858568 这些都是从Python语言本身的角度提高优化代码来提高效率,看过几本Python教材.也看过网上的一些优秀博文,都说PyPy是Python的未来,是提高python运行效率的终极杀器,今天上午闲来无事,决定也来了解一下这个杀器.首先是在网上查资料大概了解一下PyPy是什么东西,在