我正在将 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没有执行任何操作。
需要添加什么才能按顺序安装?
我有一个与此非常相似的结构:
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 文档中执行此操作。
我正在尝试使用 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 解释器其他部分的路径,或者这可能是由另一个问题引起的?
我尝试绑定一个静态函数,该函数返回指向另一个类的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 端抛出了分段错误。
任何想法?
我有一个使用 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) 我正在为一个 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?
我的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 接收 OpenCV 图像。我正在尝试将回调函数从 C++ 发送到我的 Python 模块,然后当我在我的 C++ 应用程序中调用特定的 python 方法时,我可以访问所需的图像。
在我添加更多细节之前,我需要补充一点,这方面已经有几个问题,包括:
但他们都没有关于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) 我有一个使用 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被触发。
我正在使用 pybind11 为某些 C++ 代码实现 python 绑定。现在我正在尝试为绑定编写单元测试。
class A在 C++ 中有一个像这样的构造函数:
class A
{
A(std::unique_ptr<B> B_ptr);
}
Run Code Online (Sandbox Code Playgroud)
它接受 aunique_ptr到 的对象class B。class B是一个可以派生的抽象基类。我编写了class B可以从 Python 派生的绑定。是否有可能创建unittest.mock用于派生的 Python 模拟,class B以便A在其构造函数中接受模拟?