【问题标题】:Casting 2D array with Pybind11使用 Pybind11 投射二维数组
【发布时间】:2019-07-02 12:42:37
【问题描述】:

我正在为具有头/lib 文件的 C++ 库创建 Python 绑定,但是 Pybind11 不会自动转换这个将二维数组作为参数的函数。如何正确转换此参数?

头文件像这样声明这个函数

class __declspec(dllimport) SomeClass {
    public:
        void function(uint32_t arg1, uint32_t arg2, float matrix[3][3]);

我正在绑定它

py::class_<SomeClass>(m, "_SomeClass", "SomeClass")
    .def("function", &SomeClass::function,
    py::arg("arg1"), py::arg("arg2"), py::arg("matrix"))

python setup.py bdist_wheel 输出以下内容(注释 function 绑定可以很好地构建轮子)

C:\Users\joona\git\someproject\pybind11\include\pybind11\cast.h(1931,1): error C2664:  'Return pybind11::cpp_function::{ctor}::<lambda_b1f1895366c1273186f52810f5be9d13>::operator ()(Class *,uint32_t ,uint32_t ,float (*)[3]) const': cannot convert argument 4 from 'float *' to 'float (*)[3]' [C:\Users\joona\git\someproject\build\temp.win-amd64-3.7\Release\someproject.vcxproj]

【问题讨论】:

    标签: python c++ python-3.x cmake pybind11


    【解决方案1】:

    我会选择std::array

    class __declspec(dllimport) SomeClass {
        public:
            void function(uint32_t arg1, uint32_t arg2,
                          std::array<std::array<float,3>,3> matrix);
    ...
    };
    

    pybind 将知道如何将其转换为二维列表。 此外,在您的 cpp 代码中,访问权限与 float[3][3] 相同。

    编辑:

    根据您的评论,我认为您可以使用这样的东西(请参阅from pybind documentation):

    py::class_<SomeClass>(m, "SomeClass")
       .def("function", [](SomeClass& sc, uint32_t arg1, uint32_t arg2,
                           std::array<std::array<float,3>,3> m)
            {
                float M[3][3] = {{m[0][0], m[0][1], m[0][2]},
                                 {m[1][0], m[1][1], m[1][2]},
                                 {m[2][0], m[2][1], m[2][2]}};
                return sc.function(arg1, arg2, M);
            });
    

    这里我假设矩阵只是函数的输入;如果还输出结果,您可以将结果复制回 std 数组。

    【讨论】:

    • 感谢您的建议,但不幸的是我无法访问 C++ 代码(只有 .h 和 .lib)。我想我可以用我自己的 C++ 代码包装这个库,但我希望找到一个不那么混乱的解决方案。
    • @Joona 我相应地编辑了我的答案,希望这就是你的意思
    • 是的,就是这样(或者至少它可以编译)。谢谢!
    猜你喜欢
    • 2016-11-22
    • 2018-12-16
    • 2011-01-10
    • 1970-01-01
    • 1970-01-01
    • 2018-06-10
    • 2020-10-09
    • 1970-01-01
    相关资源
    最近更新 更多