Python API C 的实例 无缝调用
Python C API
在一些场景中,以 Python 开发可以高效的完成项目进度,但是一些功能在从网上复制粘贴或者需要C语言调用时,我们就需要用到 Python C API
优势
- 不需要其他库
- 大量低级控制
- 完全可用的C++语言
缺点
- 可能比较耗时耗神
- 代码编写花费时间长
- 必须编译
- 维护成本高
- 随着C-API的变化,Python 版本之间没有前向兼容性
- 引用计数十分容易抛出异常并很难跟踪
环境
- Anaconda3 2019.10
- Clion
编写
本文以计算 Sin 正弦值为例,编写一个可以使用 python setup.py install
的 C 语言模板
示例, 创建文件 sin_module.c
1 |
|
创建 setup.py 文件:
1 |
|
随后运行
1 |
|
即可安装, 随后导入模板进行测试1
2
3
4
5python
import sin_module
print(sin_module.sin_func(180))
>> -0.8011526357338304
Py_BuildValue() 返回值定义
- “s” (string) [char *] : 将C字符串转换成Python对象,如果C字符串为空,返回 None
- “s#” (string) [char *, int] : 将 C 字符串和它的长度转换成 Python 对象,如果 C 字符串为空指针,长度忽略,返回 None
- “z” (string or None) [char *] : 作用同 “s”
- “z#” (string or None) [char *, int] : 作用同 “s#”
- “i” (integer) [int] : 将一个 C 类型的 int 转换成 Python int 对象
- “b” (integer) [char] : 作用同”i”
- “h” (integer) [short int] : 作用同”i”
- “l” (integer) [long int] : 将 C 类型的 long 转换成 Python 中的int对象
- “c” (string of length 1) [char] : 将 C 类型的 char 转换成长度为1的 Python 字符串对象
- “d” (float) [double] : 将 C 类型的 double 转换成python中的浮点型对象
- “f” (float) [float] : 作用同”d”
- “O&” (object) [converter, anything] : 将任何数据类型通过转换函数转换成 Python 对象,这些数据作为转换函数的参数被调用并且返回一个新的 Python 对象,如果发生错误返回 null
- “(items)” (tuple) [matching-items] : 将一系列的 C 值转换成 Python 元组
- “[items]” (list) [matching-items] : 将一系列的 C 值转换成 Python 列表
- “{items}” (dictionary) [matching-items] : 将一系类的 C 值转换成 Python 的字典,每一对连续的 C 值将转换成一个键值对
示例:
构建的值 | 返回值 |
---|---|
Py_BuildValue("") | None |
Py_BuildValue("i", 123) | 123 |
Py_BuildValue("iii", 123, 456, 789) | (123, 456, 789) |
Py_BuildValue("s", "hello") | 'hello' |
Py_BuildValue("ss", "hello", "world") | ('hello', 'world') |
Py_BuildValue("s#", "hello", 4) | 'hell' |
Py_BuildValue("()") | () |
Py_BuildValue("(i)", 123) | (123,) |
Py_BuildValue("(ii)", 123, 456) | (123, 456) |
Py_BuildValue("(i,i)", 123, 456) | (123, 456) |
Py_BuildValue("[i,i]", 123, 456) | [123, 456] |
Py_BuildValue("{s:i,s:i}","abc", 123, "def", 456) | {'abc': 123, 'def': 456} |
Py_BuildValue("((ii)(ii)) (ii)",1, 2, 3, 4, 5, 6) | (((1, 2), (3, 4)), (5, 6)) |
模板的属性定义
1 |
|
更多参数
Python API C 的实例 无缝调用
https://blog.forgiveher.cn/posts/1574671785/