pybind11

pybind11支持 python和c++相互调用。

安装

conda install pybind11
python -m pybind11 --includes

-IC:\Miniconda3\Include -IC:\Miniconda3\lib\site-packages\pybind11\include

visual studio 2019 中新建空白项目 ProjectCPP。

include python和pybind11的头文件

  • debug 选 x64
  • 项目右键,配置,平台选 x64
  • 项目右键,属性,“VC++目录” > “常规” > “包含目录”属性中,添加路径列表 ,确保删除 -I 前缀(若有)
C:\Miniconda3\Include 
C:\Miniconda3\lib\site-packages\pybind11\include

调整输出类型为dll, 调整输出文件名为pyd

项目右键,属性,常规,配置类型由 exe 修改为 dll。

项目右键,属性,高级,高级属性,扩展名由 .exe 修改为.pyd

链接 python的lib

项目右键,属性,“VC++目录” > “常规” > “库目录”, 添加:

C:\Miniconda3\libs

linker里添加python的lib

项目右键,属性,链接器,输入,附加依赖项,添加 C:\Miniconda3\libs 中的如下项:

python3.lib
python38.lib

编译引用 pyd

新建源文件 test.cpp

#include <pybind11/pybind11.h>

namespace py = pybind11;

int add(int a, int b)
{
    return a + b;
}


PYBIND11_MODULE(test, m) {
    m.doc() = "....";
    m.def("foo", []() {
        return "Hello world!";
        });
    m.def("add", &add, "function add");
}

生成pyd快捷键: CTRL + B, 文件输出位置: project\x64\Debug

生成的pyd文件修改为 test.pyd

在 python 中调用:

import test

s = test.add(1,2)
print(s) # 3

print(test.foo()) # Hello world!

使用NumPy数组

c++ 侧:

py::array_t<double>  test(int lenArray)
{
    // 定义2维数组
    py::array_t<double> test = py::array_t<double>(lenArray);
    test.resize({ 2,lenArray / 2 });

    // 定义可写入对象
    auto w_test = test.mutable_unchecked<2>();

    for (int i = 0; i < test.shape()[0]; i++) {
        for (int j = 0; j < test.shape()[1]; j++) {
            w_test(i, j) = i + j;
        }
    }

    return test;
}

python 侧:

# -*- coding: utf-8 -*-
# cpp编写的函数在项目cppext 的 cppext.cpp 文件中
import sys
sys.path.append('./cppext/x64/Debug/')
import cppext

r = cppext.test(20)
print(r)    
'''
[[ 0.  1.  2.  3.  4.  5.  6.  7.  8.  9.]
 [ 1.  2.  3.  4.  5.  6.  7.  8.  9. 10.]]
'''

参考

© Licensed under CC BY-NC-SA 4.0

计算机没什么用。他们只会告诉你答案。——毕加索

发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!