# py3 库模块帮助文档

[✅ 入门指南](https://www.aardio.com/zh-cn/docs/library-guide/ext/python/_.html) [🔄 类型转换](https://www.aardio.com/zh-cn/docs/library-guide/ext/python/conversion.html) [💻 版本切换](https://www.aardio.com/zh-cn/docs/library-guide/ext/python/versions.html)

## py3 成员列表 <a id="py3" href="#py3">&#x23;</a>

Python 3 扩展库,  
已自带绿色便携运行时,不用额外安装VC运行库。  
导入库时可指定小版本号，目前提供 py3.10 扩展库。  

py3 扩展库默认 Python 版本为 3.8.10。  
Python 不同版本通常并不完全兼容,不建议随意更换运行时,  
添加 Python 模块时也应使用相同版本运行时下安装的版本  

如果需要在 Python 中使用 print 函数输出到控制台  
请在导入库以前打开控制台

### py3.* <a id="py3.any" href="#py3.any">&#x23;</a>
以 ownerCall 方式调用 py3 命名空间不存在的成员函数会自动转换为调用 py3.main 的成员函数。  
ownerCall 指的是调用函数时以 `.` 操作符获取成员函数。

### py3.DecRef(指针) <a id="py3.DecRef" href="#py3.DecRef">&#x23;</a>
减少引用计数

### py3.IncRef(指针) <a id="py3.IncRef" href="#py3.IncRef">&#x23;</a>
增加引用计数

### py3.addModule("字符串参数") <a id="py3.addModule" href="#py3.addModule">&#x23;</a>
如果不存在指定名字的模块就创建新模块  
返回模块对象

### py3.addModule() <a id="py3.addModule" href="#py3.addModule">&#x23;</a>
[返回对象:py3ModuleObject](#py3ModuleObject)

### py3.addSiteDir() <a id="py3.addSiteDir" href="#py3.addSiteDir">&#x23;</a>
添加 site-packages 站点目录，  
Python 也会在站点目录下查找模块，且支持该目录下的 *.pth 。  
 默认已添加安装模块的默认目录 "\py\site-packages"，  
site.USER_BASE 默认设为工程下的 /py 目录，不允许修改

### py3.appendPath <a id="py3.appendPath" href="#py3.appendPath">&#x23;</a>
添加 Python 模块搜索目录，  
也就是追加目录到 Python 中的 sys.path。  

默认的模块搜索目录为『应用程序根目录』下的 /py 目录

### py3.appendPath("搜索路径") <a id="py3.appendPath" href="#py3.appendPath">&#x23;</a>
添加 Python 模块搜索目录，  
也就是追加目录到 Python 中的 sys.path 支持多个参数。  
支持多参数指定多个要添加的路径

### py3.builtin <a id="py3.builtin" href="#py3.builtin">&#x23;</a>
builtin 模块提供 Python 内置函数  

[返回对象:py3DictObject](#py3DictObject)

### py3.compile("字符串参数") <a id="py3.compile" href="#py3.compile">&#x23;</a>
编译字符串或py文件  
返回代码对象  
可选增加第二个参数  
可选增加第二个PyCompilerFlags参数

### py3.compile() <a id="py3.compile" href="#py3.compile">&#x23;</a>
[返回对象:py3CodeObject](#py3CodeObject)

### py3.eval("Python表达式") <a id="py3.eval" href="#py3.eval">&#x23;</a>
在 __main__ 模块中计算表达式的值

### py3.eval() <a id="py3.eval" href="#py3.eval">&#x23;</a>
[返回对象:py3Object](https://www.aardio.com/zh-cn/docs/library-reference/py3/object.html#py3Object)

### py3.exec <a id="py3.exec" href="#py3.exec">&#x23;</a>
运行 Python 代码,  
参数也可以指定内嵌资源文件路径  
注意需要引用的 Python 模块应当放在 /py 目录下,  
aardio 路径以斜杠或反斜杆开始则表示应用程序根目录下的路径,  
应用程序根目录开发时为 aardio 工程目录,发布后为 EXE 文件所在目录

### py3.exec("Python代码",flags,...) <a id="py3.exec" href="#py3.exec">&#x23;</a>
在默认的__main__命名空间运行 Python 代码，成功返回 true。  
在导入 py3 扩展库前调用 console.open 可查看 Python 错误信息。  

参数@1如果首字符为单个斜杠或反斜杆开始的文件路径：  
└── 可支持工程资源目录下的文件。  
└── 如果文件后缀为 ".aardio" 则支持 aardio 模板语法。  

可选使用参数 @2 设置 PyCompilerFlags 参数,  
参数@2不必指定,用法参考 Python 文档。  

参数@3 开始可选指定一个或多个启动参数，  
注意不必像 py3.setArgv 函数那样在首个参数中指定启动程序路径

### py3.execf <a id="py3.execf" href="#py3.execf">&#x23;</a>
首先调用 string.format 格式化代码  
然后执行格式化后的代码

### py3.execf("Python代码",...) <a id="py3.execf" href="#py3.execf">&#x23;</a>
首先调用 string.format 格式化参数并生成代码,  
然后执行格式化后的代码。  

详细用法请参考  
[格式化字符串](https://www.aardio.com/zh-cn/docs/library-guide/builtin/string/format.html)

### py3.execfile <a id="py3.execfile" href="#py3.execfile">&#x23;</a>
运行 *.py 文件  
注意需要引用的 Python 模块应当放在 /py 目录下,  
aardio 以斜杠或反斜杆开始则表示应用程序根目录下的路径,  
应用程序根目录开发时为 aardio 工程目录,发布后为 EXE 文件所在目录

### py3.execfile("Python文件路径",flags,...) <a id="py3.execfile" href="#py3.execfile">&#x23;</a>
运行 *.py 文件,成功返回true,  
参数@1如果以斜杠或反斜杆开始则表示应用程序根目录下的路径,  
应用程序根目录开发时为 aardio 工程目录,发布后为 EXE 文件所在目录,  
可选用 参数@2 设置 PyCompilerFlags 参数,  
可选增加任意个启动参数,即 sys.argv 参数

### py3.export() <a id="py3.export" href="#py3.export">&#x23;</a>
参数应指定 aardio 对象,  
table、cdata、class、function 类型参数转换为 Python 代理对象,  
支持导出 aardio 迭代器,注意迭代器返回 tuple 元组,  
其他类型参数直接返回不作转换。  

py3.export 创建的代理对象会绑定原始的 aardio 对象,  
在 Python 中调用代理对象时都会转发调用到 aardio 对象，  
对返回代理对象的所有调用也会同样经过 py3.export 处理。  

未经 py3.export 处理的 aardio 对象传入 Python 时,  
只会复制可能复制的值为纯 Python 对象,且不再关联原始对象

[返回对象:py3Object](https://www.aardio.com/zh-cn/docs/library-reference/py3/object.html#py3Object)

### py3.float() <a id="py3.float" href="#py3.float">&#x23;</a>
调用 Python 的 float 函数,  
参数可指定 aardio 或 Python 中可转为浮点数的对象,  
创建 Python 浮点数并返回 py.object 对象,  
返回的 Python 对象支持 +,-,*,/,%,<,>,<=,>=,== 等运算符

[返回对象:py3Object](https://www.aardio.com/zh-cn/docs/library-reference/py3/object.html#py3Object)

### py3.getDict(模块指针) <a id="py3.getDict" href="#py3.getDict">&#x23;</a>
相当于Python模块对象的__dict__ 属性，得到模块名称空间下的字典对象

### py3.getPath() <a id="py3.getPath" href="#py3.getPath">&#x23;</a>
返回默认搜索路径  
以分号隔开

### py3.getProgramName() <a id="py3.getProgramName" href="#py3.getProgramName">&#x23;</a>
返回程序名

### py3.getPythonHome() <a id="py3.getPythonHome" href="#py3.getPythonHome">&#x23;</a>
返回 Python 目录

### py3.globals() <a id="py3.globals" href="#py3.globals">&#x23;</a>
全局命名空间  

[返回对象:py3DictObject](#py3DictObject)

### py3.import("字符串参数") <a id="py3.import" href="#py3.import">&#x23;</a>
导入模块，相当于Python内建函数__import__()  
返回模块指针

### py3.import() <a id="py3.import" href="#py3.import">&#x23;</a>
[返回对象:py3ModuleObject](#py3ModuleObject)

### py3.int() <a id="py3.int" href="#py3.int">&#x23;</a>
调用 Python 的 int 函数,  
参数可指定 aardio 或 Python 中可转为整型数值的对象,  
创建 Python 整型数并返回 py.object 对象,  
返回的 Python 对象支持 +,-,*,/,%,<,>,<=,>=,== 等运算符,  
aardio 数值默认会转换为 Python 中的浮点数,  
如果参数需要用到整型数,可使用此函数创建整型数,  
也可以在 Python 代码中调用 int 函数转换

[返回对象:py3Object](https://www.aardio.com/zh-cn/docs/library-reference/py3/object.html#py3Object)

### py3.json <a id="py3.json" href="#py3.json">&#x23;</a>
Python 的 json 模块  

[返回对象:py3ModuleObject](#py3ModuleObject)

### py3.lasterr() <a id="py3.lasterr" href="#py3.lasterr">&#x23;</a>
如果 Python 已发生异常,  
返回错误信息,以及异常类名称,  
调用此函数会清除异常  

有些 Python 输出到控制台的错误信息这个函数获取不到。  
必须在导入 py3 扩展库以前调用 console.open 才能看到

### py3.locals() <a id="py3.locals" href="#py3.locals">&#x23;</a>
局部命名空间  

[返回对象:py3DictObject](#py3DictObject)

### py3.lock( 回调函数,... ) <a id="py3.lock" href="#py3.lock">&#x23;</a>

```aardio
py3.lock( 回调函数,...lock(  
	function(){  
		/*释放GIL以后所有调用 Python 代码必须写到这里*/	  
	}  
)
```

### py3.main <a id="py3.main" href="#py3.main">&#x23;</a>
Python 的 __main__ 模块。  
以 ownerCall 方式调用 py3 命名空间不存在的成员函数会自动转换为调用 py3.main 的成员函数。  

[返回对象:py3ModuleObject](#py3ModuleObject)

### py3.mainThread <a id="py3.mainThread" href="#py3.mainThread">&#x23;</a>
当前是否 Python 主线程  
Python 有全局锁所以无法实现真正的多线程,  
为避免不必要的麻烦,建议尽量在单线程里使用 Python

### py3.occurred() <a id="py3.occurred" href="#py3.occurred">&#x23;</a>
Python 是否发生异常

### py3.releaseThread() <a id="py3.releaseThread" href="#py3.releaseThread">&#x23;</a>
释放GIL线程锁  
调用此函数以后,所有调用 Python 的代码必须在 py3.lock 内部运行  
否则将导致进程异常退出,请小心使用,  
 Python 没有真正多线程,尽可能不要使用此函数以带来不必要的麻烦

### py3.run(...) <a id="py3.run" href="#py3.run">&#x23;</a>
直接输入启动参数启动 Python 解释器  
类似调用 python.exe  

注意 py3.10 扩展库会在执行此函数时重置 sys.path  
低于 py3.10 版本不会重置 sys.path

### py3.set() <a id="py3.set" href="#py3.set">&#x23;</a>
调用 Python 的 set 函数,  
参数可指定 aardio 或 Python 中可转为集合的对象,  
创建 Python 集合并返回 py.object 对象

[返回对象:py3Object](https://www.aardio.com/zh-cn/docs/library-reference/py3/object.html#py3Object)

### py3.setArgv("启动参数") <a id="py3.setArgv" href="#py3.setArgv">&#x23;</a>
设置sys.argv启动参数,  
参数可以是任意个字符串参数，  
也可传入一个字符串数组。  

注意第 1 个参数应当指定启动程序路径，  
Python 从第 2 个参数开始取实际参数

### py3.setPath() <a id="py3.setPath" href="#py3.setPath">&#x23;</a>
设置默认搜索路径  
以分号隔开

### py3.setProgramName("字符串参数") <a id="py3.setProgramName" href="#py3.setProgramName">&#x23;</a>
修改程序名

### py3.setPythonHome("字符串参数") <a id="py3.setPythonHome" href="#py3.setPythonHome">&#x23;</a>
改变 Python 应用程序目录

### py3.str() <a id="py3.str" href="#py3.str">&#x23;</a>
调用 Python 的 str 函数,  
参数可指定 aardio 或 Python 中可转为字符串的对象,  
创建 Python 整型数并返回 py.object 对象,  
py.object 对象都提供 toString 函数可转为 aardio 字符串,  
也可以在 aardio 中使作为 tostring 函数的参数转为普通字符串

[返回对象:py3Object](https://www.aardio.com/zh-cn/docs/library-reference/py3/object.html#py3Object)

### py3.sysObject("名字") <a id="py3.sysObject" href="#py3.sysObject">&#x23;</a>
获取sys对象

### py3.sysObject() <a id="py3.sysObject" href="#py3.sysObject">&#x23;</a>
[返回对象:py3Object](https://www.aardio.com/zh-cn/docs/library-reference/py3/object.html#py3Object)

### py3.toString() <a id="py3.toString" href="#py3.toString">&#x23;</a>
参数指定 py.object 对象或 pyObject 原生指针,  
调用 Python 内置函数 str 转换为字符串对象,  
最后转换并返回为 aardio 字符串  
失败返回null  

此函数不会检查参数类型是否正确,  
参数如果不是 py.object 对象或 pyObject 指针则会导致异常或崩溃

### py3.version <a id="py3.version" href="#py3.version">&#x23;</a>
返回  Python 内核版本  
字符串值

## ::Python3 成员列表 <a id="::Python3" href="#::Python3">&#x23;</a>

### ::Python3.* <a id="::Python3.any" href="#::Python3.any">&#x23;</a>
可输入API函数名并直接调用

### ::Python3.api("Py输入函数名字","void()" ) <a id="::Python3.api("Py输入函数名字","void" href="#::Python3.api("Py输入函数名字","void">&#x23;</a>
声明加载的Python3 API函数

## py3.export 成员列表 <a id="py3.export" href="#py3.export">&#x23;</a>

注意只能在 Python 启动线程中使用此功能,  
export 作为命名空间使用时,  
export 命名空间的 aardio 成员对象,  
可在 Python 中使用 import 语句导入  

export 作为类构造函数使用时,  
可导出 aardio 对象为 Python 代理对象,  
调用 Python 代理对象会转发到 aardio

### py3.export.* <a id="py3.export.any" href="#py3.export.any">&#x23;</a>
{
		__/*这里定义的成员函数可在 Python 中调用*/
}

## py3CodeObject 成员列表 <a id="py3CodeObject" href="#py3CodeObject">&#x23;</a>

### py3CodeObject.eval() <a id="py3CodeObject.eval" href="#py3CodeObject.eval">&#x23;</a>
运行 Python 代码并返回值  
可选增加两个参数,指定全局命名空间,局部命名空间  
命名空间必须是py3.dict()字典对象  

[返回对象:py3Object](https://www.aardio.com/zh-cn/docs/library-reference/py3/object.html#py3Object)

### py3CodeObject.exec("字符串参数") <a id="py3CodeObject.exec" href="#py3CodeObject.exec">&#x23;</a>
运行 Python 代码并返回模块对象  

[返回对象:py3ModuleObject](#py3ModuleObject)

### 全局常量

### ::Python3 <a id="::Python3" href="#::Python3">&#x23;</a>
加载的Python3.DLL模块

### 自动完成常量
_Py_eval_input=258  
_Py_file_input=257  
_Py_single_input=256  
