Python 调用 C/C++ 动态链接库
介绍
ctypes
是 Python 的外部函数库。它提供与 C 兼容的数据类型,并允许调用 DLL 或共享库 SO 中的函数
- ctypes与C数据类型对比
ctypes数据类型 |
C数据类型 |
c_char |
char |
c_short |
short |
c_int |
int |
c_long |
long |
c_float |
float |
c_double |
double |
c_void_p |
void |
c_uint8 |
unsigned char |
C 示例
C 编译为 so 动态链接库
#include "stdio.h"
void sayhi();
int max(int, int);
#include "test.h"
void sayhi(){
printf("hi so.\n");
}
int max(int a, int b)
{
return a > b ? a : b;
}
gcc -fPIC -shared test.c -o libtest.so
说明:
-shared
编译为共享库
-fPIC
Position Independent Code
的缩写,编译生成的链接库与位置无关
调用示例
#!/usr/bin/env python3
from ctypes import *
test = cdll.LoadLibrary("./libtest.so")
test.sayhi()
max =test.max
max.argtypes = [c_int, c_int]
max.restype = c_int
a = 1
b = 2
print(f'a: {a}, b: {b} max is {max(1, 2)}')
$ python3 test.py
hi so.
a: 1, b: 2 max is 2
C++ 示例
- pybind11 是一个轻量级的头文件库,它在Python中公开c++类型,反之亦然,主要用于为现有的c++代码创建Python绑定。它的目标和语法类似于出色的Boost。由David Abrahams编写的Python库:通过使用编译时自省推断类型信息来最小化传统扩展模块中的样板代码。
pip3 install pybind11