标签: pybind11

pybind11、cmake:如何安装文件?

我正在将 C++ 库与越来越流行的pybind11连接起来,以获得本机 Python 绑定;配置是通过CMake.

我的CMakeLists.txt样子

cmake_minimum_required(VERSION 3.0)

project(foo)

FILE(GLOB foo_SRCS "${CMAKE_CURRENT_SOURCE_DIR}/*.cpp")

FIND_PACKAGE(pybind11 REQUIRED)
pybind11_add_module(mylib ${foo_SRCS})
Run Code Online (Sandbox Code Playgroud)

然而,这似乎没有注册安装规则。因此,虽然构建树中的一切都按预期工作,但make install没有执行任何操作。

需要添加什么才能按顺序安装?

c++ python cmake pybind11

5
推荐指数
1
解决办法
4096
查看次数

使用 pybind11 绑定 typedef 类型的正确语法是什么?

我有一个与此非常相似的结构:

struct data_point
{
    data_point() = delete;
    data_point(const int& data) :
            m_data(data)
    {}

    int m_data;
};
Run Code Online (Sandbox Code Playgroud)

我也这样声明了这种类型。

typedef std::vector<data_point> data_list;
Run Code Online (Sandbox Code Playgroud)

该结构体的绑定定义如下:

PYBIND11_MODULE(data_lib, ref)
{
    py::class_<data_point> dp(ref, "data_point");
    dp.def(py::init<const int&>());
    dp.def_readwrite("m_data", &data_point::m_data);
}
Run Code Online (Sandbox Code Playgroud)

如何定义 typedef 列表类型的绑定?我不清楚如何在 pybind 文档中执行此操作。

c++ python syntax pybind11

5
推荐指数
1
解决办法
1938
查看次数

将 pybind11 嵌入虚拟环境

我正在尝试使用 pybind11 将 python 嵌入到我的 C++ 应用程序中。使用以下 CMake 属性,我成功地针对项目的虚拟环境进行编译。

-DPYTHON_EXECUTABLE:FILEPATH=C:/Python/Envs/myproject/Scripts/python.exe
Run Code Online (Sandbox Code Playgroud)

当我运行该应用程序时,出现错误(如下),但没有具体错误。但是我认为它无法加载我正在加载的模块 numpy 。

abort() 已被调用

#include <iostream>
#include <pybind11/embed.h>

namespace py = pybind11;

int main() {
    py::scoped_interpreter guard{};
    auto sys = py::module::import("sys");
    py::print("Hello, World from Python!");
    py::print(sys.attr("executable"));
    py::print(sys.attr("version"));
    // works until here

    auto np = py::module::import("numpy");
    py::print(np.attr("version"));

    return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

如果我只导入 sys 模块(位于标准库中),应用程序就可以正常工作。这是崩溃之前应用程序的输出:

Hello, World from Python!
C:\Develop\sandbox\python_binding\cmake-build-debug\bin\python_binding.exe
3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:59:51) [MSC v.1914 64 bit (AMD64)]
Run Code Online (Sandbox Code Playgroud)

我已将以下目录添加到我的路径中。

PATH=C:\Python\Envs\project\Scripts;C:\Python\Envs\project\Lib

我是否必须指定我正在使用的 python 解释器其他部分的路径,或者这可能是由另一个问题引起的?

c++ python pybind11

5
推荐指数
1
解决办法
2570
查看次数

无法从 pybind11 中的静态函数返回shared_ptr

我尝试绑定一个静态函数,该函数返回指向另一个类的shared_ptr。

这是示例代码

class Example {
  public:
    Example() {}
    ~Example() {}
};

class ABC {
  public:
    static std::shared_ptr<Example> get_example() {std::make_shared<Example();}
 };

void init_abc(py::module & m) {
  py::class_<Example>(m, "Example")
    .def(py::init<>());

  py::class_<ABC>(m, "ABC")
    .def_static("get_example", &ABC::get_example);
}
Run Code Online (Sandbox Code Playgroud)

这是Python的一面

example = my_module.ABC.get_example()
Run Code Online (Sandbox Code Playgroud)

然而,python 端抛出了分段错误。

任何想法?

c++ python pybind11

5
推荐指数
1
解决办法
1865
查看次数

从包装 eigen 的 pybind11 返回数组的列表或元组

我有一个使用 eigen 的 C++ 函数,它使用 pybind11 包装,以便我可以从 python 调用它。预期函数的简单版本返回一个Eigen::MatrixXd类型,pybind 成功地将其转换为 2D numpy 数组。

我希望这个函数能够返回此类矩阵的列表或元组,或者 3D numpy 数组。

我在某种程度上是 C++ 的新手,并且 pybind 的文档没有(据我所知)提供任何方向。一个模拟示例如下:

测试.cpp

#include <pybind11/pybind11.h>
#include <pybind11/eigen.h>
#include <Eigen/Dense>

Eigen::MatrixXd test(Eigen::Ref<const Eigen::MatrixXd> x, double a)
{
  Eigen::MatrixXd y;
  y = x * a;
  return y;
}

Eigen::MatrixXd *test2(Eigen::Ref<const Eigen::MatrixXd> x, Eigen::Ref<const Eigen::VectorXd> as)
{
  Eigen::MatrixXd *ys = new Eigen::MatrixXd[as.size()];
  for(unsigned int k = 0; k < as.size(); k++){
    Eigen::MatrixXd& y = ys[k];
    y = x * as[k];
  } …
Run Code Online (Sandbox Code Playgroud)

python numpy eigen pybind11

5
推荐指数
1
解决办法
8844
查看次数

如何使用 PyBind11 实现从 C++ 返回 Python Protobuf 对象的绑定?

我正在为一个 C++ 类编写 pybindngs,该类将 Google Protobuf 对象作为成员变量。我希望这些绑定函数返回(在 Python 领域)protobuf 对象的 Python 版本(Google 的 proto 编译器本机生成)。

如果我尝试在 pybind 定义中天真地返回 protobuf 的 C++ 版本

.def_readwrite("my_protobuf", &my_protobuf_)
Run Code Online (Sandbox Code Playgroud)

,我收到以下错误:

TypeError: Unable to convert function return value to a Python type! The signature was
        (self: MyClass) -> MyProtobufDef
Run Code Online (Sandbox Code Playgroud)

这是有道理的 - 返回类型是 C++ protobuf 对象,而不是 Python protobuf 对象。如何将其转换为 Python 版本的 protobuf?

c++ python protocol-buffers pybind11

5
推荐指数
0
解决办法
1921
查看次数

在 python 中使用 C++ 对象与 pybind11

我的main.cpp文件如下所示:

// Embeding the interpreter into c++
// https://pybind11.readthedocs.io/en/master/advanced/embedding.html


#include <pybind11/embed.h>
#include <iostream>
#include <string>

// Define namespace for pybind11
namespace py = pybind11;

class Vehiclee
{ 
    // Access specifier 
    public: 

    // Data Members 
    int vehicle_id;
    std::string vehicle_name; 
    std::string vehicle_color;

    // Member Functions() 
    void printname() 
    { 
       std::cout << "Vehicle id is: " << vehicle_id; 
       std::cout << "Vehicle name is: " << vehicle_name; 
       std::cout << "Vehicle color is: " << vehicle_color; 
    } 
}; 


int main() {
    // Initialize the …
Run Code Online (Sandbox Code Playgroud)

c++ python pybind11

5
推荐指数
1
解决办法
6463
查看次数

如何从 Python 获取 OpenCV 图像并在 pybind11 的 C++ 中使用它?

我试图弄清楚如何从 C++ 中的 Python 接收 OpenCV 图像。我正在尝试将回调函数从 C++ 发送到我的 Python 模块,然后当我在我的 C++ 应用程序中调用特定的 python 方法时,我可以访问所需的图像。

在我添加更多细节之前,我需要补充一点,这方面已经有几个问题,包括:

  1. how-to-convert-opencv-image-data-from-python-to-c
  2. pass-image-data-from-python-to-cvmat-in-c
  3. 编写-python-bindings-for-c-code-that-use-opencv
  4. c-conversion-from-numpy-array-to-mat-opencv

但他们都没有关于Pybind11. 事实上,他们都在使用PyObject(from Python.hheader) with and without Boost.Python. 所以我的第一个尝试是知道如何Pybind11知道它支持Numpy数组,因此它有望使事情变得更容易。

此外C++OpenCV还有两个版本,3.x 和 4.x,我最近发现 4.x 是C++11兼容的。在 Python 方面,我使用了 OpenCV 3.x,我正处于选择哪个的十字路口以及它对Pybind11.

到目前为止我尝试过的:我做了一个快速的虚拟回调并尝试传递一个cv::Mat&这样的简单:

#include <pybind11/embed.h>
#include <pybind11/numpy.h>
#include <pybind11/stl.h>
#include <pybind11/functional.h>
namespace py = pybind11;
...

void cpp_callback1(bool i, std::string id, cv::Mat img)
{ …
Run Code Online (Sandbox Code Playgroud)

c++ python opencv pybind11

5
推荐指数
2
解决办法
1594
查看次数

将 pybind11 绑定标记为已弃用的最佳方法

我有一个使用 pybind11 的带有 Python 绑定的 C++ 类。

现在我想将一种方法的绑定标记为已弃用。让我们假设它看起来像这样:

PYBIND11_MODULE(my_module, m)
{
    pybind11::class_<Foobar>(m, "PyFoobar")
        .def("old_foo", &Foobar::foo)  // <-- this is deprecated in favour of "new_foo"
        .def("new_foo", &Foobar::foo);
}
Run Code Online (Sandbox Code Playgroud)

标记PyFoobar.old_foo()为已弃用以便用户在调用方法时注意到它的最佳方法是什么?理想情况下,我希望 aDeprecationWarning被触发。

c++ python pybind11

5
推荐指数
1
解决办法
198
查看次数

如何使 Python 模拟从基类派生?

我正在使用 pybind11 为某些 C++ 代码实现 python 绑定。现在我正在尝试为绑定编写单元测试。

class A在 C++ 中有一个像这样的构造函数:

class A
{
    A(std::unique_ptr<B> B_ptr);
}
Run Code Online (Sandbox Code Playgroud)

它接受 aunique_ptr到 的对象class Bclass B是一个可以派生的抽象基类。我编写了class B可以从 Python 派生的绑定。是否有可能创建unittest.mock用于派生的 Python 模拟,class B以便A在其构造函数中接受模拟?

c++ python mocking pybind11

5
推荐指数
1
解决办法
223
查看次数

标签 统计

pybind11 ×10

python ×10

c++ ×9

cmake ×1

eigen ×1

mocking ×1

numpy ×1

opencv ×1

protocol-buffers ×1

syntax ×1