标签: pybind11

使用 Pybind11 包装 STL 容器返回类型

我想包装一个 C++ 函数(使用 Pybind11),它返回一个 STL 容器,它本身包装在一个智能指针中。一个例子如下所示。该函数已重载,因此我必须指定签名。

#include <pybind11/pybind11.h>
#include <pybind11/stl.h>
#include "my_class.h"

typedef std::array<std::complex<double>, 4> ArrayComplex4;
PYBIND11_MAKE_OPAQUE(ArrayComplex4);

namespace py = pybind11;
using namespace my_namespace;

PYBIND11_MODULE(my_module, m) {
    py::class_<MyClass>(m, "MyClass", py::dynamic_attr())
        .def("my_function", (std::unique_ptr<ArrayComplex4> (MyClass::*)(double)) &MyClass::my_function)
        .def("my_function", (std::unique_ptr<ArrayComplex4> (MyClass::*)(double, double)) &MyClass::my_function);
}
Run Code Online (Sandbox Code Playgroud)

该模块将编译,但当我尝试在 Python 中使用该函数时会出错:

类型错误:无法将函数返回值转换为 Python 类型!

我确定我只是为 Pybind11 设置了错误的东西。谢谢你的帮助!

编辑

问题肯定是在我尝试绑定std::Array数据类型时。我最终修改了要使用的代码std::Vector,然后 Pybind11 没有问题。有关如何绑定std::Array容器的信息,请参阅下面的 AS Mackey 的回答。

c++ python pybind11

3
推荐指数
1
解决办法
2536
查看次数

指向外部托管(例如:Python)资源的 C++ 智能指针?

C++中是否有指向其他人管理的资源的智能指针?我使用 pybind11 来包装 C++ 代码,如下所示。

    class B {};
    class A {
      public:
        // original C++ class interface
        A(std::shared_ptr<B> pb) : mb(pb){}
        // have to add this for pybind11, since pybind11 doesn't take shared_ptr as argument.
        A(B * pb):A(std::shared_ptr<B>(pb)){}
      private:
        std::shared_ptr<B> mb;
    }
    namespace py = pybind11;
    PYBIND11_MODULE(test, m)
    {
       py::class_<B>(m, "B")
       .def(py::init<>());

       py::class_<A>(m, "A")
       .def(py::init<B *>());
    }
Run Code Online (Sandbox Code Playgroud)

然后在 python 中,我将按如下方式使用它们:

    b = B()
    a = A(b)
Run Code Online (Sandbox Code Playgroud)

只要我不删除就可以了。当我在Python中del a时,我在C++的“A”中创建的shared_ptr mb将尝试销毁由Python管理的B对象并崩溃。所以,我的问题是 C++ 中是否有一些智能指针不从原始指针获取所有权?weak_ptr 不起作用,因为我仍然需要创建一个shared_ptr。

c++ python pybind11

3
推荐指数
1
解决办法
1657
查看次数

如何在 C++ 中操作 pybind11::dict

我正在用 C++ 编写一个接受 dict 的模块。

如何在 C++ 中操作 pybind11::dict

#include <pybind11/pybind11.h>
#include<iostream>
#include <pybind11/stl.h>
#include<map>

using namespace std;

namespace py = pybind11;

int main() {

    py::dict dict;
    dict["a"] = 1; // throws exception error - ptyes.h Line 546
    dict["b"] = 2; // throws exception error - ptyes.h Line 546

    for (auto item : dict)
    {
        std::cout << "key: " << item.first << ", value=" << item.second << std::endl;
    };
    system("pause");
    return 0;

}
Run Code Online (Sandbox Code Playgroud)

c++ python pybind11

3
推荐指数
1
解决办法
9751
查看次数

如何使用 pybind11 提供默认枚举值?

我想要有接受枚举默认参数的函数。

但我无法在 PyBind11枚举示例和文档中找到提供枚举默认值的正确方法,例如:

struct Pet
{
    enum Kind
    {
        Dog = 0,
        Cat
    };

    Pet(const std::string &name) : name(name)
    {
    }

    void setName(const std::string &name_)
    {
        name = name_;
    }

    const std::string &getName() const
    {
        return name;
    }

    Kind test(Kind kind = Dog)
    {
        if(kind == Dog)
           std::cout << "Dog" << std::endl;

        if(kind == Cat)
           std::cout << "Cat" << std::endl;

        return kind;
    }

    std::string name;
};

PYBIND11_MODULE(pet,m)
{
    py::class_<Pet> pet(m, "Pet");
    pet.def(py::init<const std::string &>())
       .def("setName", &Pet::setName)
       .def("getName", &Pet::getName)
       .def("test", …
Run Code Online (Sandbox Code Playgroud)

c++ python enums default pybind11

3
推荐指数
1
解决办法
2057
查看次数

Pybind11 默认参数 numpy 数组或 None

我正在包装一些 C++ 代码以从 Python 中使用它。我想调用一个带有参数的 C++ 函数,该参数可以采用另一个输入变量的None值或numpy.array相同大小的值。这是例子:

import example

# Let I a numpy array containing a 2D or 3D image
M = I > 0
# Calling the C++ function with no mask
example.fit(I, k, mask=None)
# Calling the C++ function with mask as a Numpy array of the same size of I
example.fit(I, k, mask=M)
Run Code Online (Sandbox Code Playgroud)

如何使用 pybind11 在 C++ 中进行编码?我有以下函数签名和代码:

void fit(const py::array_t<float, py::array::c_style | py::array::forcecast> &input, 
         int k,
         const py::array_t<bool, py::array::c_style | py::array::forcecast> …
Run Code Online (Sandbox Code Playgroud)

c++ python binding numpy pybind11

3
推荐指数
1
解决办法
3076
查看次数

如何定义“operator()”C++ 类方法的 python pybind11 绑定?

假设我有一个简单的 C++ 类

class MyClass{
     //constructor
     MyClass(int value):_value(value){};

     void operator()(AnotherClass& const b){
     // Do something with b object
     }

    private:
      int _value;
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用 pybind11 创建此类的 Python 绑定。如何绑定operator()方法?

此绑定将用于将此类的对象传递给需要回调函数作为参数的函数。

c++ python callback pybind11

3
推荐指数
1
解决办法
2000
查看次数

PyBind11:访问 Python 中的唯一指针属性

我有一个 C++ 类,它有一个指向对象的唯一指针作为属性。我希望能够在 Python 中访问该属性,以便我可以调用它的类方法。这是我的设置示例:

\n
class OuterClass {\npublic:\n   std::unique_ptr<InnerClass> obj;\n}\n\nclass InnerClass {\npublic:\n    void method();\n}\n
Run Code Online (Sandbox Code Playgroud)\n

以及 pybind11 绑定:

\n
PYBIND11_MODULE(example, m) {\n    py::class_<InnerClass>(m, "InnerClass")\n        .def("method", &InnerClass::method);\n\n    py::class_<OuterClass>(m, "OuterClass")\n        .def_readonly("obj", &OuterClass::obj);\n}\n
Run Code Online (Sandbox Code Playgroud)\n

但是,这无法编译并出现错误 error: no matching function for call to \xe2\x80\x98pybind11::cpp_function::cpp_function(std::unique_ptr<InnerClass> OuterClass::*, pybind11::name, pybind11::is_method, pybind11::sibling)

\n

我希望能够在 python 中做到这一点:

\n
outer_obj.obj.method()\n
Run Code Online (Sandbox Code Playgroud)\n

unique ptr 的文档似乎并不认为这应该是一个问题,因为它们给出了返回唯一 ptr 的函数的示例。尝试访问唯一的 ptr 属性是否有问题?我该如何解决这个问题?

\n

c++ pybind11

3
推荐指数
1
解决办法
1009
查看次数

如何将指针静态转换为 const 成员函数?

static_const令人惊讶(尴尬?)我无法正确理解成员函数的语法const。简而言之(详细信息如下)如果未标记成员函数const我使用:

static_cast<std::vector<double> (mymodule::Foo::*)(const std::vector<double>&)>(&mymodule::Foo::bar)
Run Code Online (Sandbox Code Playgroud)

但是标记成员函数Foo::bar(...) const编译器不知道该怎么做:

error: address of overloaded function 'bar' cannot be static_cast to type 'std::vector<double> (mymodule::Foo::*)(const std::vector<double> &)'
Run Code Online (Sandbox Code Playgroud)

我应该把函数的const性质放在哪里?

细节

我正在尝试为以下模块创建 Python 绑定:

error: address of overloaded function 'bar' cannot be static_cast to type 'std::vector<double> (mymodule::Foo::*)(const std::vector<double> &)'
Run Code Online (Sandbox Code Playgroud)

我用 pybind11 编写 Python 绑定:

namespace mymodule {

class Foo
{
public:

    Foo() = default;

    template <class T>
    T bar(const T& a) const
    {
        T ret = a;
        for (auto& …
Run Code Online (Sandbox Code Playgroud)

c++ constants pointer-to-member pybind11

3
推荐指数
1
解决办法
336
查看次数

如何在Sypi上放置Swig / Pybind11 C ++项目

我有代码包裹着两个pybind11痛饮,但似乎无法找到如何正确获取PyPI上的代码,所以我可以文档pip install我的包。

Pybind11 似乎有一些问题,使得很难在pypi上放置代码

我想我要的是建立Linux和OSX二轮,但我不能找到有关这个多文档。我猜有人通过travis和脚本执行此操作吗?有一种即插即用的方式来制造所有发行版的轮子吗?

python swig pypi pybind11

2
推荐指数
1
解决办法
959
查看次数

可以将连续放置在内存中的变量视为数组的一部分吗?

我正在编写一个使用 C++ 进行计算的应用程序,然后使用 pybind11 将多维结果作为 numpy 数组返回。从pybind的文档和在线看到的示例来看,numpy 数组创建基本上是传递数据数组的指针并包含步幅的详细信息。然而,在 C++ 部分,我并不热衷于使用一维array和使用一些花哨的索引,但我宁愿使用结构。这让我思考是否可以将放置在连续内存中的(同质)变量视为array.

我的思路如下。an 的元素array被放置在连续内存中。a 的元素struct也按其声明的顺序连续放置(当不涉及填充时)。因此,从内存放置的角度来看,以下四个变量声明是相同的,例如,如果我要指向第一个元素的指针,那么我可以通过一次执行一个整数值的步骤来遍历所有元素:

struct struct_array
{
    int elem[4] = {};
};

struct struct_ints
{
    int a = {};
    int b = {};
    int c = {};
    int d = {};
};

// integer matrix of shape 3x4
int one_dim_array[3 * 4] = {};
int two_dim_array[3][4] = {};
struct_array array_of_struct_arrays[3] = {};
struct_ints array_of_struct_ints[3] = {};
Run Code Online (Sandbox Code Playgroud)

这是我的测试代码,表明我的问题的答案是肯定的。它执行一些地址打印、设置和读取元素。

#include <iostream> …
Run Code Online (Sandbox Code Playgroud)

c++ memory arrays pybind11

2
推荐指数
1
解决办法
71
查看次数