问题标签 [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.
pybind11 - Pybind11 和全局 C 变量
我无法使用 pybind11 将全局变量从 C 导出到 Python。这个问题可以从一个简单的例子中重现。假设我们有一个像这样的头文件(global.h):
该数组在 C 文件 (global.c) 中定义,如下所示:
我想使用 pybind11 和以下 C++ 文件 (pyglobal.cpp) 在 Python 模块中导出这个数组:
当我使用 CMake (CMakeLists.txt) 生成我的库时,一切正常:
但是当我启动 python3 shell 并输入
我收到以下错误消息:
我在这里做错了什么?
python - py::vectorize + type_caster = NumPy 类型信息缺失
在过去的几天里,我一直在使用pybind11为现有的 C++ 库创建 Python 绑定,我真的很喜欢它!
可悲的是,我刚刚遇到了一个小问题......
我正在尝试做两件事:
type_caster
将第三方向量类型转换为 NumPy 数组并返回的自定义返回此类型的函数,该类型由以下方式自动矢量化
py::vectorize()
这两件事对自己的工作都很好。带有标量输入的矢量化函数也可以很好地工作。
但是,如果我以数组作为输入调用向量化函数,则会引发异常:
我究竟做错了什么?
或者这根本不应该工作?
以下是我的代码减少到最低限度。在我的实际代码中,vec
该类是第三方库的一部分,并且return_vector()
在我自己的代码中。
mylib.cpp
:
(请随意评论代码,我可能做错了很多事情。我特别不确定我的type_caster
代码。)
为了完整起见,以下是相应的setup.py
:
我已经编译了扩展模块
运行此 Python 代码可以正常运行:
但是,当我使用数组输入调用它时,出现错误:
我本来希望有一个二维数组,例如:
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 指针创建一个。
谢谢你。
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 绑定和调用?
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 被调用后立即被销毁。
任何想法如何解决这一问题?提前致谢!
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 的示例包可以正常工作。
python - 使用 pybind11 在 python 中打印一个 C++ 类
假设一个人有这样的课程
是否可以使用 pybind11 在 Python 中导出它,这样
显示 3.14 而不是类似
0x7fed8a8c3298 处的数据对象
python - pybind11 具有自定义持有者类型的多重继承无法转换为基本类型
介绍:
这个问题特定于使用 pybind11 库将 C++ 连接到 python。问题在于包装参与多重继承的 C++ 类,并在 python 中使用用户定义的持有者类型(而不是 unique_ptr 或 shared_ptr)。
问题:
假设有两个纯抽象接口类A和B,它们分别声明了foo()和bar()纯抽象方法。C类公开继承自A和B ,并实现foo()和bar()。MyHolder类是一个自定义的、非拥有的智能指针,类似于原始指针,但没有实现指针算术和其他安全操作符。
此外,还有两个函数将A和B封装在MyHolder中. 该代码在 C++ 中按预期工作,但从 python 调用时会引发运行时错误。
我试图将代码示例减少到最小。结果,python 示例实际上泄漏了内存。由于这不会影响可重复性,因此我倾向于使用更少的代码而不是更正确的代码。
C++ 代码
pybind11 包装代码
C++ 测试代码
输出:
foo
bar
蟒蛇测试代码
输出:
TypeError:testA():不兼容的函数参数。支持以下参数类型: 1. (arg0: test.A) -> None
调用:test.C 对象在 0x...
检查其他案例
- 如果不涉及多重继承,它可以工作(仅从A或B继承)
- 如果使用std::shared_ptr而不是MyHolder,它会起作用
- 在 python 中,isinstance(c, A)、isinstance(c, B) 和一个自然的 isinstance(c, C) 都返回True(这很奇怪),但仍然不能正确向上转换
python - Pybind11:从 C++ 端创建并返回 numpy 数组
如何从 C++ 端创建一个 numpy 数组并将其提供给 python?
当 Python 不再使用返回的数组时,我希望 Python 进行清理。
C++ 端不会用于delete ret;
释放由new double[size];
.
以下是正确的吗?
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: