IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> Torch 和 C++互相调用 pybind11 -> 正文阅读

[C++知识库]Torch 和 C++互相调用 pybind11

Torch 和 C++互相调用 pybind11

torch 和 C++互相调用

需要安装torch即可,在linux环境下实验通过。
torch.utils.cpp_extension 通过pybind11实现C++和python互相通信。
在ninja框架下,构建即时代码(JIT),只需要第一次编译C++

代码例子

展示了python如何和C++后端相互调用和传递列表和torchTensor

CPP.cpp

#include <torch/extension.h>
#include <iostream>
#include <string>
#include <iterator>


// 定义类
//https://pybind11.readthedocs.io/en/latest/advanced/classes.html
struct Pet {
    Pet(const std::string &name) : name(name) { }
    void setName(const std::string &name_) { name = name_; }
    const std::string &getName() const { return name; }

    std::string name;
};
using PetList = std::vector<Pet>;

// 定义函数,并调用python,以引用的方式传参
// https://pybind11.readthedocs.io/en/latest/advanced/cast/stl.html?highlight=STL#making-opaque-types
PYBIND11_MAKE_OPAQUE(std::vector<Pet>)

void addAndprintPet()
{
    PetList petlist;
    petlist.push_back(Pet("CatCpp"));
    py::object addPet=py::module::import("PY").attr("addPet");

    addPet(&petlist);
    
    for (auto pet:petlist)
    {
        std::cout<<"from CPP "<<pet.getName()<<std::endl;
    }
}

//通过返回值传递列表注意一切python返回皆为object,需要强转
//https://pybind11.readthedocs.io/en/latest/advanced/pycpp/object.html#instantiating-compound-python-types-from-c
void printList()
{
    py::list a;
    a.append(123); //python 有的基本都能用,包括模块
    // py::module sys=py::module::import("sys");
    // py::print(sys.attr("path"));
    py::object addNumer=py::module::import("PY").attr("addNumer");

    py::list b = addNumer(a);
    
    for (auto number:b)
    {
        std::cout<<"from CPP "<<number.cast<int>()<<std::endl;
    }
}

torch::Tensor TensorAdd(const torch::Tensor &a,const torch::Tensor &b)
{
    return a+b;
}

void mainFun()
{
    addAndprintPet();

    printList();
}

// 绑定
PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) {
    py::class_<PetList>(m, "PetList")
        .def(py::init<>())
        .def("pop_back", &PetList::pop_back)        
        .def("push_back", (void (PetList::*)(const Pet&)) &PetList::push_back)
        .def("__len__", [](const PetList &v) { return v.size(); })
        .def("__iter__", [](PetList &v) {
           return py::make_iterator(v.begin(), v.end());
        }, py::keep_alive<0, 1>());

    py::class_<Pet>(m, "Pet")
        .def(py::init<const std::string &>())
        .def("setName", &Pet::setName)
        .def("getName", &Pet::getName)
        .def("__repr__", [](const Pet& u) { return u.getName(); }); //python print方法调用

    m.def("mainFun", &mainFun, "mainFun");
    m.def("TensorAdd", &TensorAdd, "TensorAdd");
}


PY.py

import os
import torch
from torch.utils.cpp_extension import load

dir = os.path.dirname(os.path.realpath(__file__))
CPP = load(
  name="CPP",
  sources=[os.path.join(dir, "CPP.cpp")],
  verbose=False)


def addPet(petlist):
  # petlist.pop_back()
  for p in petlist:
    print('from PY',p) # petlist 是PetList类型
  petlist.push_back(CPP.Pet('CatPy'))


def addNumer(numlist):
  print('from PY',numlist)
  return numlist+[1234]

if __name__=='__main__':
  # 调用CPP的函数addAndprintPet,printList
  CPP.mainFun()

  # 定义类
  p = CPP.Pet("Molly")
  print(p)
  print(p.getName())
  p.setName("Charly")
  print(p.getName())

  # Tensor加法
  print(CPP.TensorAdd(torch.zeros((3,3)),torch.ones(3,3)))

运行结果:(verbose=True)
Emitting ninja build file /home/fuchy/.cache/torch_extensions/CPP/build.ninja...Building extension module CPP...Using envvar MAX_JOBS (64) as the number of workers...ninja: no work to do.Loading extension module CPP...Using /home/fuchy/.cache/torch_extensions as PyTorch extensions root...No modifications detected for re-loaded extension module CPP, skipping build step...Loading extension module CPP...from PY CatCppfrom CPP CatCppfrom CPP CatPyfrom PY [123]from CPP 123from CPP 1234MollyMollyCharlytensor([[1., 1., 1.],[1., 1., 1.],[1., 1., 1.]])

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-10-24 14:45:41  更:2021-10-24 14:48:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 6:09:28-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码