- 最近写
python
项目的时候要调用C++
的动态库文件,python
的ctypes
库和pybind11
库都可以调用动态库文件
ctypes
- 简单类型就用
ctypes
,python
原生自带, 使用起来简单 - 但是
C++
有复杂类型, 比如vector
时, 就会报错Segmentation fault (core dumped), 因为ctypes
没有vector
的类型映射 - https://stackoverflow.com/questions/49744870/passing-vector-from-a-c-dll-in-python-ctypes
pybind11
pybind11
是一个可以将C++
的代码编译成python
的动态库文件https://github.com/pybind/pybind11- 让
C++
的同事打包好so
文件给你, 只需要so
文件就行 - 需要注意的点
build
环境的python
版本要保持和你运行环境一样- 打包出来的文件名如下
xxxx.cpython-311(版本名)-x86_64(CPU架构)-linux-gnu(操作系统).so
- 找到自己的的项目目录放进去, 比如
app/libs/xxx/xxxx.so
- 记得执行
export PYTHONPATH="$PYTHONPATH:/var/www/app/libs/xxx"
(否则就会报错xxx No module named)
类型提示
- 安装
pip install pybind11-stubgen
- 在
so
目录下执行pybind11-stubgen xxx -o .
- 后面其它地方调用,直接使用站桩代码调用就可以