[TOC]
我对pybind11一点儿也不了解:虽然我知道Caffe中用Boost.Python来创建PyCaffe,也就是Caffe的Python接口;我也看到PyTorch基于pybind11做Python接口;但是我没有写过一行基于boost.python或pybind11做C/C++和Python接驳的代码。
鉴于Boost的编译安装真的太傲娇(好端端的CMake不用,非要邪门歪道搞一个难用而且文档也不更新的j2,bjam),直接上手看PyBind11。这一篇试着编译安装pybind11。
环境
系统:MacOSX
python: miniconda3, python3.7.1
cmake: 3.15.4
boost: conda install boost, 1.67,包含了py-boost
pip: pip install pytest
执行构建
git clone https://github.com/pybind/pybind11
cd pybind11
mkdir build
cd build
cmake .. -DBOOST_INCLUDEDIR=/Users/chris/soft/miniconda3/include
make -j3
输出:
-- Building tests with Eigen v3.3.7
-- Found Boost: /Users/chris/soft/miniconda3/include (found suitable version "1.67.0", minimum required is "1.56")
-- Catch not detected. Interpreter tests will be skipped. Install Catch headers manually or usecmake -DDOWNLOAD_CATCH=1
to fetch them automatically.
-- pybind11 v2.4.dev4
-- Configuring done
-- Generating done
-- Build files have been written to: /Users/chris/work/pybind11/build
执行安装,还好它是header-only方式的,装到了/usr/local/include/pybind11
,并且提供了cmake的配置文件(看来作者cmake水平还不错,鼓励一下:-) )
构建都执行了什么
迅速的过一遍CMakeLists.txt:
31 list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/tools")
作者把tools目录中放了各种cmake的find脚本,其实以往看到的项目都是放在${CMAKE_SOURCE_DIR}/cmake/modules目录下的:
image.png
其中Catch是C++单元测试框架(也是header-only的),2.x版本需要C++11,1.x系列不需要C++11,应该说比google的gtest要轻量一些。Eigen是矩阵计算相关的(没用过,不了解)。pybind11Tools.cmake
则是对cmake稍作封装,把重复用到的语句封装为cmake的函数。
70 string(REPLACE "include/" "${CMAKE_CURRENT_SOURCE_DIR}/include/"
71 PYBIND11_HEADERS "${PYBIND11_HEADERS}")
这里是做批量的文件路径前缀替换,比手动一个个的去添加方便多了。还是要学习一个string(REPLACE)
操作哇。
98 add_library(pybind11 INTERFACE)
105 add_library(module INTERFACE)
117 add_library(embed INTERFACE)
这几个target虽然是库,但是是INTERFACE,实际不会创建库;在安装阶段,它们3个“伪target”被依赖:
149 install(TARGETS pybind11 module embed
150 EXPORT "${PYBIND11_EXPORT_NAME}")
这样看完一遍,没有什么实质收获,记不住细节也没有用来做出东西。下一篇按官方文档例子弄一个python module出来,也就是pybind11的hello world。
网友评论