我想包装一个 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++中是否有指向其他人管理的资源的智能指针?我使用 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++ 编写一个接受 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) 我想要有接受枚举默认参数的函数。
但我无法在 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 中使用它。我想调用一个带有参数的 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++ 类
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 中访问该属性,以便我可以调用它的类方法。这是我的设置示例:
\nclass OuterClass {\npublic:\n std::unique_ptr<InnerClass> obj;\n}\n\nclass InnerClass {\npublic:\n void method();\n}\nRun Code Online (Sandbox Code Playgroud)\n以及 pybind11 绑定:
\nPYBIND11_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}\nRun 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)
我希望能够在 python 中做到这一点:
\nouter_obj.obj.method()\nRun Code Online (Sandbox Code Playgroud)\nunique ptr 的文档似乎并不认为这应该是一个问题,因为它们给出了返回唯一 ptr 的函数的示例。尝试访问唯一的 ptr 属性是否有问题?我该如何解决这个问题?
\nstatic_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) 我有代码包裹着两个pybind11和痛饮,但似乎无法找到如何正确获取PyPI上的代码,所以我可以文档pip install我的包。
Pybind11 似乎有一些问题,使得很难在pypi上放置代码。
我想我要的是建立Linux和OSX二轮,但我不能找到有关这个多文档。我猜有人通过travis和脚本执行此操作吗?有一种即插即用的方式来制造所有发行版的轮子吗?
我正在编写一个使用 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)