将C++ PyTorchTensor转换为Python PyTorchTensor

iaqfqrcu  于 2022-11-09  发布在  Python
关注(0)|答案(1)|浏览(193)

对于我正在做的一个项目,我需要从C调用一个Python函数,该函数的输入是PyTorch Tensor。(我找到的link 1link 2信息)可以将C PytorchTensor转换为PyObject,它可以作为调用Python函数的输入。然而,我尝试过通过在代码中直接包含头文件来导入此函数,但在调用此函数时,总是会返回错误 * LNK 2019 *,并带有以下描述:
严重程度代码说明项目文件行抑制状态错误LNK 2019在函数main pythonCppTorchExp C:\Users\MyName\source\repos\pythonCppTorchExp\pythonCppTorchExp\example-app.obj 1中引用了无法解析的外部符号“__declspec(dllimport)struct object * __cdecl THPVariable_Wrap(class at::TensorBase)”(imp?THPVariable_Wrap@@YAPEAU_object@@VTensorBase@at@@Z)
我认为问题出在我如何在我的C文件中导入THPVariable_Wrap函数。但是,我对C还不是很熟练,这方面的信息也很有限。除了Pytorch,我还使用Boost来调用Python,我使用的是Microsoft Visual Studio 2019(v142)和C++ 14。我在下面发布了我使用的代码。

C++文件


# include <iostream>

# include <iterator>

# include <algorithm>

# include <boost/python.hpp>

# include <Python.h>

# include <string.h>

# include <fstream>

# include <boost/filesystem.hpp>

# include <torch/torch.h>

# include <torch/csrc/autograd/python_variable.h> /* The header file where  */

namespace python = boost::python;
namespace fs = boost::filesystem;

using namespace std;

int main() {
    string module_path = "Path/to/python/folder";

    Py_Initialize();

    torch::Tensor cppTensor = torch::ones({ 100 });
    PyRun_SimpleString(("import sys\nsys.path.append(\"" + module_path + "\")").c_str());

    python::object module = python::import("tensor_test_file");
    python::object python_function = module.attr("tensor_equal");

    PyObject* castedTensor = THPVariable_Wrap(cppTensor) /* This function call creates the error.*/;

    python::handle<> boostHandle(castedTensor);
    python::object inputTensor(boostHandle);
    python::object result = python_function(inputTensor);

    bool succes = python::extract<bool>(result);
    if (succes) {
        cout << "The tensors match" << endl;
    }
    else {
        cout << "The tensors do not match" << endl;
    }
}

Python文件

import torch

def tensor_equal(cppTensor):
    pyTensor = torch.ones(100)
    areEqual = cppTensor.equal(pyTensor)
    return areEqual
lnvxswe2

lnvxswe21#

这是链接器问题。您可能必须链接libtorch.python.so。它可以位于类似 /opt/conda/lib/python3.8/site-packages/torch/lib/libtorch_python.so 的位置。或者您已经安装了libtorch的位置。

相关问题