当前位置: 首页 > news >正文

【Python】调用C++

 
 
 
 

Python 调用 C++ 模块通常有三种方法:

1. 直接调用动态库:通过系统原生的 .so(Linux)或 .dll(Windows)文件进行调用。

2. 使用 pybind11:借助这一强大的 C++/Python 绑定库,可以便捷地导出 C++ 函数和类。

3. 使用 PyTorch Extension:适用于在 PyTorch 框架中集成自定义 C++ 算子。

下面分别展示在 Linux 和 Windows 系统下,使用第一种方法、第二种方法以及 PyTorch Extension 的具体实现示例。

1. Linux下直接调用so:

example.cpp:

// example.cpp
extern "C" {int add(int a, int b) {return a + b;}double multiply(double a, double b) {return a * b;}
}

编译指令:

g++ -shared -fPIC -o libexample.so example.cpp

main.py:

from ctypes import cdll, c_int, c_double# 加载DLL
lib = cdll.LoadLibrary('./libexample.so')# 调用函数lib.add.argtypes = [c_int, c_int]
lib.add.restype = c_int
result = lib.add(3, 4)
print(f"3 + 4 = {result}")# 对于有明确参数类型的函数,可以指定类型
lib.multiply.argtypes = [c_double, c_double]
lib.multiply.restype = c_double
result = lib.multiply(2.5, 4.0)
print(f"2.5 * 4.0 = {result}")

 

2. Windows下直接调用dll:

example.cpp:

// 使用__declspec(dllexport)导出函数
extern "C" {__declspec(dllexport) int add(int a, int b) {return a + b;}__declspec(dllexport) double multiply(double a, double b) {return a * b;}
}

编译指令:

cl /LD example.cpp /link /OUT:example.dll

main.py:

import ctypes
from ctypes import cdll, c_int, c_double# 加载DLL
lib = cdll.LoadLibrary('./example.dll')# 调用函数
lib.add.argtypes = [c_int, c_int]
lib.add.restype = c_int
result = lib.add(3, 4)
print(f"3 + 4 = {result}")# 对于有明确参数类型的函数,可以指定类型
lib.multiply.argtypes = [c_double, c_double]
lib.multiply.restype = c_double
result = lib.multiply(2.5, 4.0)
print(f"2.5 * 4.0 = {result}")

 

3. Linux下使用pybind调用:

example_bind.cpp:

#include <pybind11/pybind11.h>int add(int a, int b) {return a + b;
}double multiply(double a, double b) {return a * b;
}double divv(double a, double b) {return (a / b);
}// 创建Python模块
PYBIND11_MODULE(example_bind, m) {m.def("add", &add, "A function that adds two numbers");m.def("multiply", &multiply, "A function that multiplies two numbers");m.def("divv", &divv, "A function that div two numbers");}

编译指令:

g++ -O3 -Wall -shared -std=c++11 -fPIC $(python3 -m pybind11 --includes) example_bind.cpp -o example_bind$(python3-config --extension-suffix)
或:
python setup.py build_ext --inplace

setup.py:

# setup.py
from setuptools import setup, Extension
import pybind11ext_modules = [Extension('example_bind',['example_bind.cpp'],include_dirs=[pybind11.get_include()],language='c++'),
]setup(name='example_bind',ext_modules=ext_modules,zip_safe=False,
)

main.py:

import example_bindresult = example_bind.add(3, 4)
print(f"3 + 4 = {result}")result = example_bind.multiply(2.5, 4.0)
print(f"2.5 * 4.0 = {result}")result = example_bind.divv(2.5, 4.0)
print(f"2.5 / 4.0 = {result}")

 

4. Windows下使用pybind调用:

example_bind.cpp:

#include <pybind11/pybind11.h>int add(int a, int b) {return a + b;
}double multiply(double a, double b) {return a * b;
}double divv(double a, double b) {return (a / b);
}// 创建Python模块
PYBIND11_MODULE(example_bind, m) {m.def("add", &add, "A function that adds two numbers");m.def("multiply", &multiply, "A function that multiplies two numbers");m.def("divv", &divv, "A function that div two numbers");}

编译指令:

cl /EHsc /LD /I C:/Users/xx/AppData/Local/Programs/Python/Python39/include /I C:/Users/xx/AppData/Local/Programs/Python/Python39/Lib/site-packages/pybind11/include example_bind.cpp /link /LIBPATH:C:/Users/xx/AppData/Local/Programs/Python/Python39/libs python39.lib /OUT:example_bind.pyd
或:
python setup.py build_ext --inplace

setup.py:

# setup.py
from setuptools import setup, Extension
import pybind11ext_modules = [Extension('example_bind',['example_bind.cpp'],include_dirs=[pybind11.get_include()],language='c++'),
]setup(name='example_bind',ext_modules=ext_modules,zip_safe=False,
)

main.py:

import example_bindresult = example_bind.add(3, 4)
print(f"3 + 4 = {result}")result = example_bind.multiply(2.5, 4.0)
print(f"2.5 * 4.0 = {result}")result = example_bind.divv(2.5, 4.0)
print(f"2.5 / 4.0 = {result}")

 

5. 使用 PyTorch Extension 调用:

torch_extension.cpp:

#include <torch/extension.h>torch::Tensor add_tensors(torch::Tensor a, torch::Tensor b) {return a + b;
}// 注册扩展
PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) {m.def("add_tensors", &add_tensors, "Add two tensors");
}

setup.py:

# setup.py
from setuptools import setup
from torch.utils.cpp_extension import CppExtension, BuildExtensionsetup(name='torch_extension',ext_modules=[CppExtension('torch_extension', ['torch_extension.cpp'])],cmdclass={'build_ext': BuildExtension}
)

编译指令:

python setup.py install

main.py:

import torch
import torch_extensiona = torch.rand(100)print(a)
b = torch.rand(100)
result = torch_extension.add_tensors(a, b)
print(result)   
http://www.hskmm.com/?act=detail&tid=26784

相关文章:

  • 方法作业
  • [100ask_imx6ullpro] buildroot构建emmc镜像并烧录
  • 2025 汽车改装公司最新推荐榜:一站式服务生态企业盘点,含奔驰宝马新能源改装及新锐品牌权威测评重庆宝马汽车改装/重庆新能源汽车改装/重庆汽车改装贴膜/重庆汽车改装轮毂刹车公司推荐
  • 2025 布袋包装厂家最新推荐榜:自贸区实力厂商领衔,含手提袋、帆布袋等全品类,年销 500 万级生产商精选无纺布袋/布袋生产/云南布袋包装/茶叶布袋厂家推荐
  • 2025 年成型机厂家最新推荐排行榜:冷弯 / 光伏支架 / 门业 / 建材等领域设备企业精度与耐用性实测点评魔方方管/门框角码/导槽/底樑/光伏支架/C型钢成型机厂家推荐
  • 2025 年平板机厂家最新推荐榜单:聚焦技术实力与市场口碑,5 大优质品牌实测点评
  • 语音识别与合成的融合技术解析
  • 2025 年阳光导入源头厂家最新推荐榜:领军企业技术实力、案例与直销模式深度解析及选择指南工厂/学校/医院/地下车库/隧道阳光导入系统厂家推荐
  • 从Node.js到React/Vue3:流式输出实用的技术的全栈实现指南
  • 用低成本FPGA实现FSMC接口的多串口(UART)控制器
  • 2025 火烧板源头厂家最新推荐榜单:自有矿山保障品质,高硬度耐磨产品全覆盖,五莲花 / 芝麻白 / 防滑芝麻黑采购优选指南
  • 2025 年太阳能路灯厂商最新推荐榜:聚焦优质企业,从技术实力到合作案例全方位解析太阳能道路灯/景观灯/警示灯/庭院灯/草坪灯/杀虫灯厂家推荐
  • 2025 年最新软件开发机构推荐排行榜:涵盖 CRM / 物联网 / 运维管理等系统定制的权威甄选指南成都软件开发/软件定制开发/crm系统定制软件开发机构推荐
  • Luogu P11660 我终将成为你的倒影 题解 [ 紫 ] [ 分块 ] [ 分类讨论 }
  • 2025 年最新推荐!小程序开发机构排行榜:覆盖定制开发 / 电商 / 预订 / 配送多场景优质服务商成都小程序开发/小程序定制开发/电商小程序开发/预订服务小程序开发公司推荐
  • CF280D k-Maximum Subsequence Sum 题解(线段树+反悔贪心维护k段最大子段和)
  • 2025 西安新房住宅最新推荐榜权威发布:多维度测评 + 选房指南,助你精准置业品质/高端/优质/品牌/刚需新房推荐
  • C# async await 测试一
  • 2025 年快速卷帘门厂家最新推荐排行榜:聚焦智能定制与高效供货,精选实力厂家助您精准选购
  • 实验课1
  • 课后作业1
  • 详细介绍:Windows如何定制键盘按键
  • 深入解析:Oracle、PostgreSQL 与 MySQL 数据库对比分析与实践指南
  • TheHackersLabs Templo writeup
  • PCIe扫盲——链路初始化与训练基础(三)之LTSSM
  • #attrs
  • 国庆比赛总结
  • 记录第一个博客
  • PCIe扫盲——链路初始化与训练基础(二)
  • 2025 年 ppt 素材模板 /ppt 模板 ai 生成 /ppt 模板制作 /ppt 模版 / 课件 PPT 模板工具推荐:iSlide 技术优势与全场景服务能力解析