Python调用C++

一、创建C++工程

1、创建文件准备

  • 创建CMakeList文件
cmake_minimum_required(VERSION 2.8.12)
project(hello)
add_subdirectory(pybind11)
pybind11_add_module(hello hello.cpp)
  • 创建c++文件
#include <pybind11/pybind11.h>

namespace py = pybind11;

PYBIND11_MODULE(hello, m)
{
    m.doc() = "pybind11 example moudle";

    m.def("prt", []()
        {
            return "Hello, World!";
        });
}

完成后目录内容如下:
在这里插入图片描述

2、cmake编译项目

选择项目目录
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

此时build目录下如下:

在这里插入图片描述
运行hello.sln文件即可打开项目,打开后点击生成
在这里插入图片描述
生成了pyd结尾的hello.cp39-win_amd64.pyd文件即可在python中直接调用
在这里插入图片描述

3、Python导入调用

  生成好的.pyd文件还不能直接被python导入,需要放在python能够找到的路径下,即python库包统一存放的位置“**/Lib/site-packages”。如果是用的用的Anaconda自带的python,即直接拷贝放在D:\Anaconda3\Lib\site-packages目录里面了。
  放好之后就可以打开python放心调用了:
  或者直接放在项目目录下,在项目路径下直接调用
在这里插入图片描述

4、从python传递numpy数组到c++处理

C++代码


#include <iostream>
#include <pybind11/pybind11.h>
#include <pybind11/numpy.h>

namespace py = pybind11;

/*
1d矩阵相加
*/
py::array_t<double> add_arrays_1d(py::array_t<double>& input1, py::array_t<double>& input2 ) {

    // 获取input1, input2的信息
    py::buffer_info buf1 = input1.request();
    py::buffer_info buf2 = input2.request();

    if (buf1.ndim != 1 || buf2.ndim != 1)
    {
        throw std::runtime_error("Number of dimensions must be one");
    }

    if (buf1.size != buf2.size)
    {
        throw std::runtime_error("Input shape must match");
    }

    //申请空间
    auto result = py::array_t<double>(buf1.size);
    py::buffer_info buf3 = result.request();

    //获取numpy.ndarray 数据指针
    double* ptr1 = (double*)buf1.ptr;
    double* ptr2 = (double*)buf2.ptr;
    double* ptr3 = (double*)buf3.ptr;

    //指针访问numpy.ndarray
    for (int i = 0; i < buf1.shape[0]; i++)
    {
        ptr3[i] = ptr1[i] + ptr2[i];
    }

    return result;

}

PYBIND11_MODULE(hello, m)
{
    m.doc() = "pybind11 example moudle";

    m.def("prt", []()
        {
            
            return "Hello, World!";
        });
    m.def("add_arrays_1d", &add_arrays_1d);
}

python测试代码

var1 = hello.add_arrays_1d(np.array([1, 3, 5, 7, 9]),
                                 np.array([2, 4, 6, 8, 10]))

5、从python传递字符串列表到c++处理

C++代码

#include <pybind11/pybind11.h>
#include <stdio.h>

namespace py = pybind11;
using namespace std;

#if PY_VERSION_HEX < 0x03000000
#define MyPyText_AsString PyString_AsString
#else
#define MyPyText_AsString PyUnicode_AsUTF8
#endif

int run(py::list inlist) {
    int argc = (int)inlist.size();
    char** argv = (char**)malloc(argc * sizeof(char*));

    for (int i = 0; i < argc; ++i)
        argv[i] = (char*)MyPyText_AsString(inlist[i].ptr());

    for (int i = 0; i < argc; ++i)
        fprintf(stderr, "%s\n", argv[i]);

    free(argv);

    return 0;
}

PYBIND11_MODULE(hello, m)
{
    m.doc() = "pybind11 example moudle";

    m.def("prt", []()
        {
            return "Hello, World!";
        });

    m.def("run", &run, "runs the example");
}

测试结果
在这里插入图片描述

参考:

  1. Python调用C++(实战篇)
  2. python numpy与C++数据传递
  3. 通过pybind11将字符串列表从python传递给C
  4. python利用pybind11调用PCL点云库
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PythonC++都是很强大的编程语言,它们都有着自己的优势和特点。在一些情况下,我们可能需要在Python调用C++代码来实现更高效的计算或者更底层的操作。这时候可以使用PythonC++扩展库来实现。 PythonC++扩展库可以让我们将C++代码编译成Python调用的模块,然后在Python环境中使用。常见的PythonC++扩展库有Boost.Python、Cython、SWIG等。这里以Cython为例,介绍如何使用Python调用C++。 1.安装Cython 在使用Cython之前,需要先安装Cython。可以通过pip工具进行安装,命令如下: ``` pip install cython ``` 2.编写C++代码 下面是一个简单的C++代码示例,实现了一个计算两个整数和的函数: ``` // sum.cpp int sum(int a, int b) { return a + b; } ``` 3.编写Cython代码 下面是一个简单的Cython代码示例,调用了上面的sum函数: ``` # sum.pyx cdef extern from "sum.cpp": int sum(int a, int b) def py_sum(int a, int b): return sum(a, b) ``` 4.编写setup.py文件 下面是一个简单的setup.py文件,用于编译Cython代码生成Python模块: ``` # setup.py from distutils.core import setup from Cython.Build import cythonize setup( ext_modules=cythonize("sum.pyx") ) ``` 5.编译生成Python模块 在命令行中执行以下命令,即可编译生成Python模块: ``` python setup.py build_ext --inplace ``` 6.在Python调用C++代码 下面是一个简单的Python示例,调用了上面生成的Python模块: ``` # main.py import sum a = 1 b = 2 c = sum.py_sum(a, b) print(c) # 输出3 ``` 通过上述步骤,就可以在Python调用C++代码了。需要注意的是,在编写Cython代码时,需要使用Cython的语法规则,而不能直接使用Python的语法规则。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值