这回让我们把 Python 玩出花来
直接上代码先看效果:
import com;
import winex;
import py3;
var pyCode = /**
def testPy(com,winex):
# 在 Python 里直接使用 aardio 对象,简单得就像在 aardio 里调用 aardio 对象
wsh = com.CreateObject('wscript.shell')
wsh.exec('notepad')
# 直接调用 aardio 标准库函数
winex.wait(None,None,'Notepad','Edit');
# 直接使用 aardio 创建的迭代器
for(hwnd,title,threadId,processId) in winex.each('Notepad'):
hCtrl = winex.findEx(hwnd,None,'Edit')
winex.sendString('测试一下',hCtrl)
**/
//# 执行Python代码
py3.exec( pyCode );
//# 用 py3.export(com) 直接将 aardio 对象完整导入 Python
py3.main.testPy(
py3.export(com),
py3.export(winex)
);
上面代码中的 py3.export() 是一个类构造函数,参数可以指定 aardio 中的对象、类、函数、迭代器等等 ……,返回一个可以在 Python 中使用的代理对象—— 可用于在 Python 中直接操作 aardio 对象,不需要写任何复杂的代码。
在 aardio 里调用 Python 对象是同样的传址方式,Python 对象在 aardio 里会表现为一个 pyObject 对象,这个 pyObject 对象可以像普通 aardio 对象一样使用,又保持对原始 Python 对象的引用 —— 可用于在 aardio 中直接操作 Python 对象。
但是默认情况下,aardio 对象转换为 Python 对象是传值而不是传址,好处是 Python 得到的是纯粹的 Python 对象,一切变得纯粹而简单,缺点是断开了与 aardio 原始对象的连接,能做一般的数据交换但不能直接从 Python 中控制 aardio 对象。
之前我们可以在 aardio 中利用 py3.export 导出 aardio 函数库模块,例如:
py3.export.aardio = {
exportFunction = function(){
};
exportFunction2 = function(){
};
}
上面这种写法是将 py3.export 作为类的名字空间使用 —— 并定义静态的成员对象,而这些类的静态成员对象就自动成为 Python 中可以使用 import 语句引入的 aardio 函数库模块( 这些模块只应当包含普通的自定义函数)。
然后在 Python 中我们可以简单地引入上面的函数库模块,例如:
var pyCode = /**
import aardio;
def testPy():
aardio.exportFunction ()
**/
//运行Python代码
py3.exec( pyCode );
这种导出函数库模块的名称不一定要是 'aardio',你可以修改为其他模块名称。要注意这种方式导出的只是纯函数库模块,其参数与返回值的交互转换规则仍然遵守 Python 扩展库的默认规则:
1、Python 对象传入 aardio 是传址2、aardio 对象传入 Python 是传值
而新增的 py3.export () 则提供了全新的方式,让 aardio 对象以传址的方式传入 Python —— 以实现在 Python 中直接调用、控制 aardio 对象。这些是最新版本 Python 扩展库提供的功能( aardio 中的 Python 扩展库包含 py3,py2,py 等扩展库,覆盖 Python 各主要版本,功能与接口保持兼容并同步更新 ),相关的范例、文档已更新。
另外 py3,py2,py 扩展库都是完全开源的,代码量也非常少,查看这些库的源代码可了解更多的细节。