python¶
通过pip指令安装自己的python包¶
pip安装流程简介¶
如果想让自己的python库可以通过 pip3 install . --user 来安装,那么需要编写一个 setup.py 文件。
pip3 install . --user 其实会分两个步骤来执行。
创建一个临时目录,执行 setup.py 里面的指令,并把指定包目录的代码拷贝至 <build_dir>/lib.xxx 中。
把第一步产生的 <build_dir>/lib.xxx 移动至 ~/.local/lib/python3.6/site-packages/ 路径下。
pip3 install . --user 与下面的两条指令是等价的,分别对应上面两步,而这时候的 <build_dir> 就是 ./build/。
python3 setup.py build
python3 setup.py install --user
pybind11¶
简易使用流程¶
添加github上的pybind11为子仓库
git submodule add https://github.com/pybind/pybind11
修改的cpp源文件,封装需要绑定的变量、函数和类。
编写CMakeLists.txt文件,比如这样:
cmake_minimum_required(VERSION 3.10)
project(pybind11-examples)
add_subdirectory(pybind11)
pybind11_add_module(${PROJECT_NAME} src/)
绑定自定义类¶
向python提供C++中的自定义类型,可以参考 pybind11官方文档。
然而C++中实现的类并非一定要在python代码中调用其成员变量和函数,在部分场景下,它作为参数提供给pybind11封装的C++接口,这时候只需要在pybind11编写库的时候定义该类即可。
#include <pybind11/pybind11.h>
#include <iostream>
namespace py = pybind11;
struct A {
void print() {
std::cout << "a..." << std::endl;
}
};
void pa(A a) {
a.print();
}
A ga() {
return A();
}
PYBIND11_MODULE(_cambriconLib, m) {
m.def("add", [](double x, double y) -> double { return x + y; });
py::class_<A>(m, "A");
m.def("ga", &ga);
m.def("pa", &pa);
}
Warning
cpp文件中必须有该类的完整定义
绑定时必须声明该类,否则python无法识别返回类型