python

通过pip指令安装自己的python包

pip安装流程简介

如果想让自己的python库可以通过 pip3 install . --user 来安装,那么需要编写一个 setup.py 文件。

pip3 install . --user 其实会分两个步骤来执行。

  1. 创建一个临时目录,执行 setup.py 里面的指令,并把指定包目录的代码拷贝至 <build_dir>/lib.xxx 中。

  2. 把第一步产生的 <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

如何编写setup.py

如果代码库不需要编译,那么直接调用 setuptools 包里面的 setup 函数即可,需要指明 nameversionpackages 等参数。

如果需要编译,那么需要自定义extension和builder,详细信息可以参考 pybind11 example 的 setup.py

Note

self.build_temp 指的是编译的临时目录。

self.build_lib 指的是生成的包的路径,也就是上面的 <build_dir>/lib.xxx

pybind11

简易使用流程

  1. 添加github上的pybind11为子仓库

git submodule add https://github.com/pybind/pybind11
  1. 修改的cpp源文件,封装需要绑定的变量、函数和类。

  2. 编写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无法识别返回类型