使用pybind11将c++扩展为python

一、在VS中直接生成pyd

参考:

pybind11在Windows下的使用 - 酱_油 - 博客园 (cnblogs.com)

编写 Python 的 C++ 扩展 - Visual Studio (Windows) | Microsoft Learn

缺点:生成的pyd不能直接用于不同系统

  1. 首先安装pybind11并在VS中配置

安装pybind11:mirrors / pybind / pybind11 · GitCode

配置:正常创建项目并添加cpp文件后,在项目的属性中设置如下:

E:\Installed\Anaconda3\include

E:\Installed\pybind11-master\include

E:\Installed\Anaconda3\libs

python37.lib

python3.lib

2.在原有的c++代码基础上添加头文件,如果需要路径传参,可以将原有main函数中的arg转化为普通函数的参数

#include <pybind11/pybind11.h>

int add(int x, int y) {
    return x + y;
}

3.使用PYBIND11_MODULE宏将C++函数包装为Python模块

PYBIND11_MODULE(example, m) {
    m.def("add", &add, "A function which adds two numbers");
}

其中,“example”是Python模块的名称(注意此名称要和项目名称保持一致),“m”是pybind11库中的一个module_对象,m.def函数用于将C++函数add包装为Python函数,并设置函数的文档字符串。

4.编译运行生成pyd文件,将pyd文件置于python项目中即可调用(如果修改了c++的函数后,要重新生成扩展库,如果c++源代码中调用了其他库,此时在pyd目录下还生成了其他dll等文件,一并复制到python项目中,下例在loopsubd文件夹中

import example
if __name__ == "__main__":
    x, y = 12, 2
    answer = example.add(x, y)
    print(f"In Python: int: {x} int {y} return val {answer}")


import loopsubd.loop_subdivision as loop_subdivision

if __name__ == "__main__":
    loop_subdivision.run("U","data/model_RZY/IOS_U_RZY.obj", "data/model_RZY/CBCT_U_RZY.obj","data/model_RZY/IOS_single_o/U/","data/model_RZY/CBCT_single_o/U/","data/model_RZY/CBCT_single_subdivision/","data/model_RZY/IOS_single_smooth/","data/model_RZY/CBCT_trans/match/","data/model_RZY/CBCT_single_trans/match/","data/model_RZY/CBCT_nricp/IOS/","data/model_RZY/CBCT_nricp/CBCT/","data/model_RZY/RZY_alveolar_bone_U.obj","data/model_RZY/bone_trans/")

二、在pycharm中生成pyd

参考:

pybind11—python C/C++扩展编译 - 简书 (jianshu.com)

优点:可以在不同系统分别直接生成

构建项目及文件目录,其中build和pyd是通过对setup.py的命令行实现生成的

main.cpp

#include<pybind11/pybind11.h>
#include<pybind11/numpy.h>
#include <iostream>
#include <Eigen/Dense>
#include <Eigen/Core>
using namespace std;

int main()
{
    //建立2行3列矩阵,并为矩阵赋值
    Eigen::Matrix<float, 2, 3> matrix_23;
    matrix_23 << 1, 2, 3, 4, 5, 6;
    cout << matrix_23 << endl;
    //访问矩阵中的元素
    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 3; j++)
            cout << matrix_23(i, j) << "\t";
        cout << endl;
    }
    //system("pause");
}

PYBIND11_MODULE(eigen_demo, m) {
    m.def("main", &main, "eigen demo");
}

setup.py

from setuptools import Extension
from setuptools import setup

__version__ = '0.0.1'

# 扩展模块
ext_module = Extension(
    # 模块名称
    name='eigen_demo',
    # 源码
    sources=[r'main.cpp'],
    # 包含头文件
    include_dirs=[r'E:\Installed\Anaconda3\include',
                  r'E:\Installed\pybind11-master\include',
                  r'E:\Library\eigen-3.3.4\eigen-3.3.4'],
    # 库目录
    #library_dirs=[],
    # 链接库文件
    language='c++'
)

setup(
    name='eigen_demo',
    version=__version__,
    author_email='xxx@163.com',
    description='A eigen demo',
    ext_modules=[ext_module],
    install_requires=['numpy']
)

切换到setup.py所在目录(右键目录文件夹——Open In——Terminal),执行以下命令自动生成pyd文件

test.py:导入pyd文件,测试成功

import src.eigen_demo as eigen_demo

eigen_demo.main()

结果:
1 2 3
4 5 6
1    2    3    
4    5    6    

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言转换Python工具是一种能够将C语言代码转换为Python代码的辅助工具。在开发过程中,使用不同的编程语言可能会带来一些障碍,而C语言转换Python工具则提供了一种简化转换过程的方法。 C语言转换Python工具的主要功能包括将C语言的语法结构转换为Python的语法结构,并根据不同的规则和约定将C语言中的特定功能转换为Python中的等效功能。这包括转换变量类型、转换循环和条件语句、转换函数和类等。 使用C语言转换Python工具的好处是可以节省开发时间和减少代码迁移所需的工作量。由于C语言和Python之间存在一些语法和语义差异,手动将C语言代码转换为Python代码可能会非常耗时且容易引入错误。而使用转换工具可以自动完成大部分的转换工作,并且可以通过配置选项进行一些定制化的转换。 然而,需要注意的是C语言转换Python工具并非万能,对于一些特定的C语言代码,特别是涉及到底层操作和特殊C语言特性的代码,转换可能会有一些限制和局限性。因此,在使用工具进行转换时,需要仔细分析和测试转换后的Python代码,确保代码的正确性和性能。 总的来说,C语言转换Python工具是一个有助于将C语言代码转换为Python代码的工具,可以提高开发效率和减少代码迁移的工作量。但是,在使用工具进行转换时,需要对转换结果进行仔细分析和测试,以确保生成的Python代码的正确性和性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值