问题标签 [pybind11]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1514 浏览

pybind11 - Pybind11 和全局 C 变量

我无法使用 pybind11 将全局变量从 C 导出到 Python。这个问题可以从一个简单的例子中重现。假设我们有一个像这样的头文件(global.h):

该数组在 C 文件 (global.c) 中定义,如下所示:

我想使用 pybind11 和以下 C++ 文件 (pyglobal.cpp) 在 Python 模块中导出这个数组:

当我使用 CMake (CMakeLists.txt) 生成我的库时,一切正常:

但是当我启动 python3 shell 并输入

我收到以下错误消息:

我在这里做错了什么?

0 投票
1 回答
605 浏览

python - py::vectorize + type_caster = NumPy 类型信息缺失

在过去的几天里,我一直在使用pybind11为现有的 C++ 库创建 Python 绑定,我真的很喜欢它!

可悲的是,我刚刚遇到了一个小问题......

我正在尝试做两件事:

  • type_caster将第三方向量类型转换为 NumPy 数组并返回的自定义

  • 返回此类型的函数,该类型由以下方式自动矢量化py::vectorize()

这两件事对自己的工作都很好。带有标量输入的矢量化函数也可以很好地工作。

但是,如果我以数组作为输入调用向量化函数,则会引发异常:

我究竟做错了什么?

或者这根本不应该工作?


以下是我的代码减少到最低限度。在我的实际代码中,vec该类是第三方库的一部分,并且return_vector()在我自己的代码中。

mylib.cpp

(请随意评论代码,我可能做错了很多事情。我特别不确定我的type_caster代码。)

为了完整起见,以下是相应的setup.py

我已经编译了扩展模块

运行此 Python 代码可以正常运行:

但是,当我使用数组输入调用它时,出现错误:

我本来希望有一个二维数组,例如:

0 投票
1 回答
3664 浏览

python - 使用 Python、C++ 和 pybind11 返回和传递原始 POD 指针(数组)

我有一个返回原始float指针的 C++ 函数,以及另一个接受原始float指针作为参数的 C++ 函数。就像是:

我希望能够使用 Python 传递指针。像这样的东西:

我正在使用 pybind11 创建我的本机 python 模块,但我不知道如何为该get_ptr()函数创建绑定。如果我只是执行以下操作:

get_ptr()函数返回一个 PythonFloat对象。我想这是有道理的,因为 python 中没有指针类型。但是,因为现在这是一个简单的Float,所以当我调用use_ptr()函数并在 C/C++ 中迭代指针时,只有数组的第一个元素是正确的。其余都是垃圾。为了解决这个问题,在 C++ 中,我必须将指针转换为 / 从std::size_t. 通过这样做,一切正常。

但是,我想问一下:是否有一种“正确的方法”可以在不std::size_t使用 pybind11 进行转换的情况下实现上述目标?

如果你好奇我为什么这样做:我明白我所做的不是类型安全的。此外,我从不触摸 Python 端的指针/整数。我只是从一个本机模块中检索它并将其传递给另一个。此外,我不能将指针转换为某种 numpy 视图,因为指针并不总是在 CPU 上。有时我想传递 CUDA 指针。py::array_t除非我复制数据(而且我不想这样做),否则不可能从 CUDA 指针创建一个。

谢谢你。

0 投票
2 回答
913 浏览

pybind11 - 使用 pybind11 将函数与 std::initializer_list 参数绑定

我正在尝试使用 pybind11(v2.2.2+) 创建 python 绑定,但无法弄清楚如何调用具有单个 std::initializer_list 参数的 C 函数。

pybind11 绑定是:

从python,我试图这样调用:

这是在 MacOS 上使用 llvm 编译的示例 C 代码-std=C++14

python 代码包含对结果的描述:

此测试代码演示了与定义为的参数的绑定const int &a, const int &b确实匹配并调用了 list_ints 函数,但显然有些事情是不正确的,因为在访问参数时会发生 seg 错误。

有没有办法void list_ints(std::initializer_list<int>)从 Python 绑定和调用?

0 投票
2 回答
1093 浏览

python - Pybind11:在 Construct 上将类所有权转移到 C++

我遇到了一个问题,即使用 pybind11 从 c++ 基类派生的 python 类被立即破坏(垃圾收集)。我希望 C++ 获得动态分配对象的所有权,但我似乎无法做到这一点。我尝试过 keep_alive,将 shared_ptr<> 作为 py::class_ 模板参数传递,然后 py::return_value_policy... 没有任何效果。我怀疑这只是用户错误。

这是对我在架构类似的更大代码库中遇到的实际问题的简化。更改架构不是一种选择,因此使这个示例工作对我来说至关重要。

我有两个 c++ 类,我为使用 pybind11 创建了 python 接口。A类和B类都有虚方法,所以有对应的蹦床类来支持继承。用户调用 B::Run() 函数会导致创建一个动态分配的(通过新的)A 对象。当我在 python 中创建这两个类的特化时,如下所示.... 分段错误,因为 B::aBase 在 B::Run 被调用后立即被销毁。

任何想法如何解决这一问题?提前致谢!

0 投票
0 回答
1682 浏览

python - 使用 setuptools 为使用 pybind11 包装的 C++ 代码创建 Python 包

我有一个名为的 C++ 文件VBB.cpp,其中包含一些类的实现,我使用该pybind11库为这些类编写了 Python 绑定,它们位于bindings.cpp. 我可以成功编译代码:

然后将 Python 中的 C++ 代码与import library.

我想通过setuptools. 我刚刚使用了https://github.com/pybind/python_examplesetup.py提供的示例文件,并修改了调用Extension

如果我运行它编译的安装脚本,但如果我尝试import VBB在 Python 中运行,我会收到以下错误:

ImportError: dynamic module does not define module export function (PyInit_VBB)

我是新手,setuptools所以我不确定我是否做错了什么。来自 GitHub 的示例包可以正常工作。

0 投票
1 回答
401 浏览

python - 使用 pybind11 在 python 中打印一个 C++ 类

假设一个人有这样的课程

是否可以使用 pybind11 在 Python 中导出它,这样

显示 3.14 而不是类似

0x7fed8a8c3298 处的数据对象

0 投票
1 回答
1085 浏览

python - pybind11 具有自定义持有者类型的多重继承无法转换为基本类型

介绍:

这个问题特定于使用 pybind11 库将 C++ 连接到 python。问题在于包装参与多重继承的 C++ 类,并在 python 中使用用户定义的持有者类型(而不是 unique_ptr 或 shared_ptr)。

问题:

假设有两个纯抽象接口类AB,它们分别声明了foo()bar()纯抽象方法。C类公开继承自AB ,并实现foo()bar()MyHolder类是一个自定义的、非拥有的智能指针,类似于原始指针,但没有实现指针算术和其他安全操作符。
此外,还有两个函数将AB封装在MyHolder中. 该代码在 C++ 中按预期工作,但从 python 调用时会引发运行时错误。

我试图将代码示例减少到最小。结果,python 示例实际上泄漏了内存。由于这不会影响可重复性,因此我倾向于使用更少的代码而不是更正确的代码。

C++ 代码

pybind11 包装代码

C++ 测试代码

输出:
foo
bar

蟒蛇测试代码

输出:
TypeError:testA():不兼容的函数参数。支持以下参数类型: 1. (arg0: test.A) -> None

调用:test.C 对象在 0x...

检查其他案例

  • 如果不涉及多重继承,它可以工作(仅从AB继承)
  • 如果使用std::shared_ptr而不是MyHolder,它会起作用
  • 在 python 中,isinstance(c, A)、isinstance(c, B) 和一个自然的 isinstance(c, C) 都返回True(这很奇怪),但仍然不能正确向上转换
0 投票
1 回答
5233 浏览

python - Pybind11:从 C++ 端创建并返回 numpy 数组

如何从 C++ 端创建一个 numpy 数组并将其提供给 python?

当 Python 不再使用返回的数组时,我希望 Python 进行清理。

C++ 端不会用于delete ret;释放由new double[size];.

以下是正确的吗?

0 投票
1 回答
872 浏览

python - Pybind11:创建数据的 numpy 视图

我想在 C++ 类中创建数据的 numpy 视图。

但是下面的内容是复制而不是视图。

蟒蛇测试:

结果:

C++ 行a.mutable_data()[0] = -100;不会将第 0 个元素更改为 -100。这显示py::array_t<int> a(4, &_data[0]);创建副本而不是视图int _data[4];

修改数组a.view()不会将数据更改a为 100 秒。这表明这a.view()是一个副本,而不是 中数据的视图a

主.cpp:

CMakeLists.txt: