Swift直接调用Python函数库
文章目录
【注意】最后更新于 October 15, 2018,文中内容可能已过时,请谨慎使用。
{% github PerfectlySoft Perfect-Python 63589be width = 30% %}
Perfect - Python
本项目提供了在Swift服务器应用上直接引用Python 2.7函数库的简便方法。
本项目采用Swift Package Manager 软件包管理器编译,是Perfect 项目的一部分,但是也可以独立运行
在使用之前请准备好最新的Swift 4.1.2 工具链
Linux 编译事项
首先请确保 libpython2.7-dev 已经在 Ubuntu 16.04 上正确安装:
| |
MacOS 编译事项
请确定 Xcode 9.0 以上版本已经正确安装
快速上手
首先在Package.swift中增加依存关系:
| |
然后将下列头文件导入Swift源代码:
| |
请注意在任何程序调用之前,必须调用Py_Initialize()函数初始化python嵌入环境:
| |
导入Python函数库模块
使用 PyObj 类对象用于导入python模块。下列参考范例中,一个名为/tmp/clstest.py的脚本被动态导入到当前Swift运行环境:
| |
访问Python变量
导入模块后,您可以使用PyObj.load()函数加载任何一个变量;也可以反过来用 PyObj.save()命令保存当前变量为一个新的值。
比如,以下python脚本中有个叫做 stringVar 的字符串变量:
| |
那么要取得这个字符串的值只需要这样做:
| |
此时您还可以为该变量直接写入新的字符串值:
| |
注意 目前,Perfect-Python仅支持如下Swift / Python数据类型自动转换:
| Python 类型 | Swift 类型 | 备注 |
|---|---|---|
| int | Int | |
| float | Double | |
| str | String | |
| list | [Any] | 递归转换 |
| dict | [String:Any] | 递归转换 |
比如,您可以把一个字符串 String 转换为 PyObj,通过 let pystr = "Hello".python() 或者 let pystr = try PyObj(value:"Hello") 完成转换。
反过来,如果要把 PyObj 类转换为Swift数据类型,比如字符串,则仍然有两种方法:let str = pystr.value as? String 和 let str = String(python: pystr)。
执行Python函数
方法 PyObj.call() 用于带参数执行某个python函数。以如下python脚本为例:
| |
Perfect-Python 可以用下列方法封装并调用以上函数,您所需要注意的仅仅是其函数名称以及参数。其中函数名称用字符串代替,而参数用一个数组表达:
| |
Python类对象
请同样使用 PyObj.load() 函数用于家在Python类对象,但是注意后面一定要紧跟一个PyObj.construct() 用于初始化类对象实例。该方法同样支持用一个任意类型的数组作为参数进行对象构造。
假设如下脚本的典型python类对象 Person,该类有两个属性姓名name 和年龄age,还有一个名为“自我介绍”的类对象方法intro():
| |
在Swift中初始化上述类对象的方法需要进行以下两步走:
| |
之后就可以访问类实例的属性变量和方法了,如同上文所提到的普通变量和函数调用的方法一样:
| |
回调函数
参考以下python代码,此时如果执行 x = caller('Hello', callback) 则可以将函数作为参数进行回调:
| |
在Swift中等效的代码平淡无奇,只不过将待调函数作为参数而已::
| |
文章作者 iTBoyer
上次更新 2018-10-15