[翻译] python Tutorial 之四
Tutorial 3: IronPython 和 COM 互操作性
COM 互操作性是.NET 框架的重要部分. 为在.NET应用中使用COM 对象, 要求一个包含.NET metadata的COM对象的
interop编译.本tutorial 将会描绘如创建interop assemblies的轮廓 (在这个情况下,它们不是被COM 对象构造者所
提供) ,同时会示范在IronPython使用COM 对象.
完成本tutorial 估计耗时: 20 分钟
本tutorial 目的是控查在IronPython中COM 的互操作性.
Exercise 1: Merlin the Wizard
本练习由两个任务组成. 首先我们将会为COM 对象库创建一个interop assembly,然后使用.NET 反射工具探查
(explore)它. 第二个任务我们会在IronPython中使用COM 对象库.
在本练习中,您将会创建一个 COM interop assembly ,然后在 IronPython使用它去驱动COM 对象.
Task 1: Creating COM interop assemblies
-
从"开始"菜单中打开 "SDK 命令提示" 或"Visual Studio 2005 命令提示" .
-
.NET 框架SDK通过 "tlbimp" 工具来将COM 类型库转换成 .NET metadata 信息 -- the interop assembly.
我们要使用的COM 对象库 msagent, 其位于 %SystemRoot%"msagent"agentsvr.exe. 使用tlbimp 工具生成msagent的
interop assembly (tlbimp 会写到当前路径下):
tlbimp %SystemRoot%"msagent"agentsvr.exe
C:"IronPython"Tutorial>tlbimp %SystemRoot%"msagent"agentsvr.exe
Microsoft (R) .NET Framework Type Library to Assembly Converter 2.0.50727.42
Copyright (C) Microsoft Corporation. All rights reserved.
Type library imported to AgentServerObjects.dll
-
.NET metadata 信息保存在AgentServerObjects.dll中. 使用ildasm 工具去探查(explore)生成的DLL:
ildasm AgentServerObjects.dll
-
当浏览metadata 树时, 注意到在层级根部有"AgentServerObjects"名空间. 该名空间包括接口和一个类
AgentServerClass. 查看并调用该类的方法是下一个任务的主题. -
当您查看AgentServerObjects.dll, 关闭ildasm 工具. 拷贝 AgentServerObjects.dll 到tutorial 路
径下,然后关闭Windows 命令提示.
Task 2: 在IronPython中使用COM 对象
-
在tutorial路径下启动Python 控制台.
-
使用clr模块中的"AddReferenceToFile" 函数, 添加对AgentServerObjects.dll的引用:
import clr
clr.AddReferenceToFile("AgentServerObjects.dll")
-
引入AgentServerObjects 名空间内容,然后使用dir() 函数查看内容:
from AgentServerObjects import *
dir()
-
创建AgentServerClass实例并查看其内容:
a = AgentServerClass()
dir(a)
控制台输出如下内容:
>>> a = AgentServerClass()
>>> dir(a)
['CreateObjRef', 'Equals', 'Finalize', 'GetAttrNames', 'GetCharacter', 'GetHashCode', 'GetLifetimeService', 'GetMemberNames', 'GetSuspended', 'GetType', 'InitializeLifetimeService', 'Load', 'MemberwiseClone', 'ReferenceEquals', 'Register', 'ToString', 'Unload', 'Unregister', '__class__', '__delattr__', '__doc__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__']
-
查看AgentServerClass类的Load()方法参数:
a.Load.__doc__
>>> a.Load.__doc__
'(int, int) Load(self, object vLoadKey)'
Load 方法有一个输入参数 (name of the character to load) 和两个输出参数. 当调用该方法时,
IronPython 会转换两个输出参数变成多个返回值.
-
加载"Merlin the Wizard" 字符 (字符数据存于c:"WINDOWS"msagent"chars). Load 方法返回多值
打包成一个tuple - 第一个值为实际的字符ID. 在变量中获取字符 id:
cid = a.Load("Merlin.acs")[0]
-
调用AgentServerClass 实例的GetCharacter 方法来获取actual 字符, 显示字符并用它think(方法)
“IronPython Tutorial”字符串:
c = a.GetCharacter(cid)
c.Show(0)
c.Think("IronPython Tutorial")
-
Merlin有一些播放动画。通过调用GetAnimationNames方法获取动画的列表. 调用播放方法,播放动
画中的一幅--"Read":
for n in c.GetAnimationNames(): print n
RestPose
Blink
Idle2_2
Idle2_1
Idle1_1
Idle1_3
Idle1_2
Idle1_4
Greet
Idle3_1
GestureUp
GestureDown
GestureLeft
GestureRight
Show
Hide
Hearing_4
Hearing_1
Hearing_2
Hearing_3
Alert
Explain
Processing
Thinking
Searching
Acknowledge
Wave
DontRecognize
Uncertain
Decline
Sad
StopListening
GetAttention
GetAttentionReturn
Idle3_2
Surprised
Congratulate_2
Reading
Announce
Read
ReadReturn
Writing
Write
WriteReturn
Congratulate
Confused
Suggest
MoveRight
MoveLeft
MoveUp
MoveDown
StartListening
WriteContinued
DoMagic1
DoMagic2
LookDown
LookDownBlink
LookDownReturn
LookLeft
LookLeftBlink
LookLeftReturn
LookRight
LookRightBlink
LookRightReturn
LookUp
LookUpBlink
LookUpReturn
ReadContinued
Pleased
GetAttentionContinued
Process
Search
Think
c.Play("Read")
105
-
(可选项) 为了演示一系列动画, 我们能够对每个动画调用 c.Play(animation_name) 方法. Python
的 lamda 函数可以简化这一过程. 我们可以创建全局方法并基于动画名称去指派他们:
for n in c.GetAnimationNames(): globals()[n] = lambda name=n: c.Play(name)
这里我们通过在全局名空间调用方法来让 Merlin 播放动画:
Congratulate()
-
停止Merlin's 动画, 隐藏它, 并退出IronPython 控制台
c.StopAll(0)
109
c.Hide(0)
Exercise 2: 使用字拼写检查
在本练习中,您将会创建一个Microsoft Word 实例并使用它检查字拼写.
Task 1: 访问word并检查拼写
-
在tutorial路径下启动IronPython 控制台.
-
引入 clr 模块并添加对 Word COM interop assembly 的引用.
import clr
clr.AddReferenceByPartialName("Microsoft.Office.Interop.Word")
from Microsoft.Office.Interop.Word import ApplicationClass
-
启动Word实例作为一个COM 服务。当它隐藏后就不必再显示了,但您在Windows
任务管理器中看到它--查找WINWORD.EXE进程 。
w = ApplicationClass()
-
定义如下拼写检查方法. 记往用空格缩进函数内容, 并用一个额外的return或enter
来完成函数定义.
def check_word (word):
return w.CheckSpelling(word)
check_word("foo")
check_word("food")
-
您可尝试输入一对单词, 但现在定义一个校正的函数. 首先,需要添加一个文档以便我们调用
GetSpellingSuggestions(), 如不打开文档,它会返回一个错误信息.
w.Documents.Add()
-
GetSpellingSuggestions() 返回值中的第一个结果是一个集合项, 每项都是一个修正建议
(correction suggestion). 我们使用 Python 列表反复检查COM 集合对象并调用集合中每一个对象上的
Name 属性. 每个项的Name 属性是一个字符串,而这个串就是被正确拼写的建议.
def suggestions(word):
res_objects = w.GetSpellingSuggestions(word)
return [x.Name for x in res_objects]
-
现在, 我们关闭Word 并退出IronPython 控制台. 当您进入下一行并hit return, 如果您正在
看Windows 任务管理器, 您会看到WINWORD.EXE 进程退出了(go away).
w.Quit()
Task 2: 使用Windows Form 对话框校正拼写
在本任务中,您将使用一个已写过的例子,它与任务1很相似, 示范了两个附加特性. 它使用Python
标准模块去注册一个"清空"(clean up)函数以便在IronPython 控制台结束时,关闭Word 进程. 这个
例子有一个函数function--“correct_word”, 它使用Windows Form 作为对话框,让用户返回一个正确
的单词.
-
在tutorial 路径下启动IronPython 控制台.
-
引入拼写检查.
-
对(一个)拼写正确的单词调用spellcheck.correct_word 方法, 您将会看到该方法返回这个单词.
-
对(一个)拼写错误的单词调用spellcheck.correct_word , 会显示一个Windows Form, 该窗口与
单词拼写校对类似. 您可从列表中提取并点击替换按钮,双击suggestions列表中的一个单词, 敲入
custemo内容单击“Use Custom”按钮。点击“Ignore”按钮将返回这个拼写错误的单词.
-
打开 spellcheck.py 文件,了解 Windows Form 的代码和函数.
Tutorial Summary
本tutorial 专注于使用tlbimp 工具生成COM interop assemblies (.NET 框架SDK)并在IronPython
环境中来控制COM 对象.
本tutorial 执行了如下练习.
在本tutorial中, 您创建一个COM interop assembly(msagent COM object). 您使用.NET Framework
SDK的 tlbimp 工具. 使用ildasm 工具, 您探查interop assembly内容. 然后在IronPython中加载interop
assembly, 创建COM 对象的实例, 并指挥Merlin 播入不同的动画.
您也使用Word去进行单词拼写检查, 了解如何支持missing optional arguments, 以及检查创建
Windows Form的代码和对话框.
Tutorial 4: 调试IronPython 程序
本tutorial 将会简单运行调试会话(session), 使用Microsoft CLR Debugger调试Python 脚本. 如果
您有Visual Studio SKU,并了解Visual Studio,可以考虑跳过本练习.
本tutorial估计耗时: 10 分钟
本tutorial 的目标是使用“Microsoft CLR Debugger”调试简单的Python 脚本.
Exercise 1: 调试IronPython 程序
本练习中, 您将会在Microsoft CLR Debugger中逐步运行简单的Python 脚本.
Task 1: 使用Microsoft CLR Debugger调试IronPython 程序
-
起动 Microsoft CLR Debugger.
-
在“调试”菜单(debugger Menu), 选择“ Debug / Program to Debug ...”
-
For Program, 浏览到 ipy.exe (位于安装路径下)
-
For Arguments, 敲入 debugging.py
-
修改工作路径到Tutorial路径下
-
点击确定(Click OK)
-
From Menu, 选择“ File / Open / File”. 浏览到Tutorial 路径并打开这两个文件:
debugging.py
first.py
-
在debugging.py 文件的如下行设置断点 (将光标置在该行上并按下F9):
print first.add(1, 2)
-
按 F5 - 启动调用.
IronPython 将会编译 debugging.py 文件并开始执行它. 您将点击第三行的断点.
注意: 如您在启动调试会话时系统性能降低, 退出debugger, 打开 Windows 浏览器并删除如下路径:
%USERPROFILE%"Application Data"Microsoft"DbgClr
-
按 F11, 逐步运行程序, 查看变量 (甚至在“查看”[watch] 窗口中修改变量的值) 并显示调用堆栈.
-
结束调用会话并退出 debugger.
Tutorial 总结:
本tutorial 中您做了如下的练习.
本tutorial 中, 您在IronPython 下运行了简单的调试会话. 您使用Microsoft CLR Debugger,
放置断点并逐步运行Python 程序.
好了,今天的内容就到这里了。
在下一篇中,我们会看到如何扩展 IronPython
感兴趣的朋友可以通过EMAIL或在回复中与我联系。
作者:代震军 (daizhj)
博客:http://daizhj.cnblogs.com