aardio 文档

aardio 范例:调用 aardio 对象

//调用 aardio 对象  
import winex;
import console.int; 
import py2;

//可以这样预先指定 Python 全局变量
py2.main.console = py2.export(console);////用 py2.export(com) 直接将 aardio 对象完整导入 Python

var pyCode = /** 
def testPy(winex):
    # 在 Python 里直接使用 aardio 对象,简单得就像在 aardio 里调用 aardio 对象
    console.log("在 Python 里调用 aardio 库函数")

    # 还能支持 aardio 创建的迭代器
    for(hwnd,title,threadId,processId) in winex.each():
        console.log(title)
**/

//执行 Python 代码,Python 2.7 的编码问题很坑很坑,这里用 execRaw 取消编码转换
py2.execRaw( pyCode ); 

//调用 Python 函数
py2.main.testPy(  
    py2.export(winex) //也可以通过参数将 aardio 对象导出给 Python
);   

/**details(重要说明) 

一、简介
-----------------------------------------------------------
当 py2.export() 作为对象构造函数使用时,
可用于导入参数指定的 aardio 对象为 Python 对象。
这种「代理对象」在 Python 中将保持对原始 aardio 对象的引用,也就是传址而非传值。

二、解决了什么问题
-----------------------------------------------------------
aardio 在与 Python 交互时,
默认除了布尔值、浮点数值、小于53位的整数值,布尔值转换为纯 aardio 值以外。
在 aardio 这些对象存为 pyObject,并保留对原始 Python 对象的引用。

而 aardio 对象在自动转换为 Python 对象时,
默认是传值而非传址,Python 中不保留对 aardio  对象的引用。

py2.export 的特别之处在于可以导出 aardio 模块到 Python,
在 Python 中引用与操作原始的 aardio 对象。

例如:

    py2.export.aardio = {
        exportFunction = function(){

        } 
    }

然后可以在 Python 中 import aardio,调用这个模块的所有成员函数。

三、py2.export( aardioObject ) 使用要点
-----------------------------------------------------------
py2.export( aardioObject ) 
可以导出 aardio 中的 table,cdata,class,function 等 aardio 对象,
也可以自动导出 aardio 迭代器,适用于 Python 的 for 语句(aardio 迭代器在 Python 中返回 tuple 而非单个值)

对于整型数值 py2.export( number ) 默认转换为 Python 中的整型,而非浮点数。
其他类型(例如字符串) py2.export 不作转换直接返回。

Python 调用导出函数的返回值也会由 py2.export() 再次导出 。
Python 调用 aardio 导出函数的参数会自动调用 parseValue() 解析为纯 aardio 值。

四、使用限制
-----------------------------------------------------------
注意 py2.export 只能在 Python 启动线程中使用,
这是 Python 的限制与 aardio 无关! 

aardio 可以支持真多线程,
也提供了 py2.lock 简化了 Python 全局锁操作,支持除 py2.export 以外的接口。
但是:py2.export 不支持多线程。

在非 Python 主线程下,py2.export 为 null 值,
使用 py2.mainThread 也可以检测是否  Python 主线程, 

其实 Python 因为有全局锁 —— 无法实现真正的多线程, 
调用 process.python 创建多进程来替代多线程可能更方便一些。
end details**/

Markdown 格式