【发布时间】:2021-12-28 21:30:36
【问题描述】:
我尝试通过 pybind11 从 python 的引用将向量/数组传递给 C++ 库。 C++ 库可以填充数据。调用C++后,希望python端能拿到数据。
这是简化的 C++ 代码:
#include <pybind11/pybind11.h>
#include <pybind11/numpy.h>
#include <pybind11/stl.h>
class Setup
{
public:
Setup(int version) : _version(version) {}
int _version;
};
class Calculator
{
public:
Calculator() {}
static void calc(const Setup& setup, std::vector<double>& results) { ... }
}
namespace py = pybind11;
PYBIND11_MODULE(one_calculator, m) {
// optional module docstring
m.doc() = "pybind11 one_calculator plugin";
py::class_<Setup>(m, "Setup")
.def(py::init<int>());
py::class_<Calculator>(m, "Calculator")
.def(py::init<>())
.def("calc", &Calculator::calc);
}
在python方面,我打算:
import os
import sys
import numpy as np
import pandas as pd
sys.path.append(os.path.realpath('...'))
from one_calculator import Setup, Calculator
a_setup = Setup(1)
a_calculator = Calculator()
results = []
a_calculator.calc(a_setup, results)
results
显然结果没有传回。有没有一种巧妙的方法来做到这一点?
【问题讨论】:
-
你的意思是
a_calculator.calc(a_setup, results)? -
是的,你是对的。我已经纠正了。谢谢!
-
我对@987654324@了解不多,但我对C++和Python都有经验。你意识到
std::vector不是python 的[],对吧?虽然pybind可能可以将一个对象转换为另一个对象,但它们是完全不同的对象,所以我看不到通过引用传递是如何实现的。 -
谢谢 ALX23z。我可以灵活地将数据类型 python 传递给 C++ 端。
-
您可以使用numpy数组并通过引用传递它们。
标签: python c++ pass-by-reference pybind11