问题标签 [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 回答
1411 浏览

pybind11 - 使用 pybind11 创建一个 numpy python 字符串数组

我正在尝试使用 pybind11 从 c++ 修改一个 numpy 字符串数组。我正在使用的代码具有以下结构:

我面临的问题是此错误消息:

pybind11/numpy.h:1114:19:错误:静态断言失败:尝试使用非 POD 或未实现的 POD 类型作为 numpy dtype static_assert(is_pod_struct::value, "尝试使用非 POD 或未实现的 POD 类型作为一个 numpy dtype");

不知道有什么问题。在 python 中,您可以创建 numpy 字符串数组,那么我做错了什么?谢谢。

0 投票
1 回答
464 浏览

python - 处理pybind11中的不透明指针

我正在将用 C++ 编写的 Python 模块从 Boost.Python 移动到 Pybind11。我的 C++ 代码依赖于具有不透明指针的 C 库。对于 Boost.Python,我使用此处的文档来处理这些不透明的指针:https ://www.boost.org/doc/libs/1_66_0/libs/python/doc/html/reference/to_from_python_type_conversion/boost_python_opaque_pointer_conv.html

我找不到 Pybind11 的等效代码。作为参考,这是我想使用 Pybind11 向 Python 公开的 C 标头:

这可以通过 Boost.Python 公开,如下所示:

0 投票
2 回答
7449 浏览

python - How do I import a module created with pybind11 on Ubuntu

I am trying to setup a CMake project that creates python bindings for its c++ functions using pybind11 on Ubuntu.

The directory structure is:

The CMakeLists.txt file:

The repository builds successfully and the file arithmetic.cpython-36m-x86_64-linux-gnu.so is produced. How do I import this shared object file into python?

The documentation in the pybind11 docs has this line

but I want to build using CMake and I also don't want to have to specify extra include directories every time I run python to use this module.

How would I import this shared object file into python like a normal python module?

I am using Ubuntu 16.04.

0 投票
1 回答
1126 浏览

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

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

我也有这种类型的声明。

此结构的绑定定义为:

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

0 投票
1 回答
163 浏览

python - 使用 setup.py 构建时删除默认编译器选项

我正在使用 pybind11 将我的 C++ 代码暴露给 Python。假设我正在做的正是pybind 开发人员提供的示例。最后,我正在使用

编译器被调用

我的问题很简单:

我怎样才能,至少暂时,在我的代码中打开断言?即如何告诉 setuptools 忽略-DNDEBUG编译器选项?

0 投票
1 回答
557 浏览

c++ - 从'unsigned __int64'到'unsigned __int64 *'的转换错误 - Pybind11

下载此https://github.com/pybind/pybind11/archive/v2.2.3.zip 并创建一个简单的 cpp 文件后:

在此处输入图像描述

我收到这个错误

在此处输入图像描述

有人知道这可能指的是什么,以及如何解决它吗?


根据要求,这里是完整的错误日志:

0 投票
1 回答
810 浏览

python - Python 和 C++ (Pybind11):Python 扩展模块导入错误

我尝试包装一个C++ 函数pybind创建一个python-module。使用 Visual Studio 编译后,我完成了创建.pyd文件。我试图导入这个文件(python>>> import pymodule)但得到这个错误:

.pyd按照我上面解释的方式导入文件通常是正确的方法吗?为什么我会收到此错误?

0 投票
1 回答
561 浏览

python - pybind11 与 numpy 的矩阵乘积

编辑 2(2018 年 6 月 18 日。)

我使用了Matrix建议的课程

http://pybind11.readthedocs.io/en/stable/advanced/pycpp/numpy.html

使用Matrix我实现的产品如下:

在发布时(在核心 i7 6700 HQ 上)结果如下:

在此处输入图像描述

确实比py::array_t<double>'s好很多。图表(纵坐标为秒,横坐标为方阵大小): 在此处输入图像描述

在 intel mkl 下,numpy 相对来说是一点点。在大小区域 [1500,1600] 中两者都有显着下降,mkl 更陡峭。可以注意到,随着矩阵大小的增加,“numpy time / intel time”这个因素正在减少。

这次在核心 i7-7700K 上:

在此处输入图像描述

测试python代码是:


编辑 1(2018 年 6 月 16 日。)

我尝试了同样的方法,这次使用 intel mkl,将for初始代码的循环替换为

初始代码在英特尔酷睿 i5 4570 上运行。这次在英特尔酷睿 i7 6700 HQ 上运行所有三个案例,结果如下:

在此处输入图像描述

两个备注

1) 对于相同的 Python 3.6.5 32 位,在我的笔记本电脑的核心 i7 上使用 numpy 的 Python 比在我在工作中使用的旧核心 i5 桌面上要慢。朴素的 c++ 稍微快一点。很奇怪。

2)在核心 i7 上,c++ intel mkl vs numpy 的因子是 3.41


最初的问题

我写了这个非常幼稚的 c++ pybind11 代码:

我比较了执行两个固定 500*500 随机生成矩阵的乘积的平均(500 个产品)时间,得到以下结果:

那个 118 因素让我感到惊讶。当然,我没想到在第一次尝试时就击败了 numpy,但是两次平均时间之间的 100 倍让我感到惊讶。c++如果我将 intel mkl 用于产品的一部分或任何其他库,我认为该因素不会得到显着改善。

所以我猜这个因素主要是由numpy数组到py::array_t<double>s的“转换”和逆转换来解释的。

我知道 numpy 依赖于c代码(很快c++就是代码),但我真的很想知道这些转换是如何在 numpy 中完成的。我在 github 上浏览了 numpy 的源代码,但没有找到“编组”部分或 c 产品部分。

0 投票
1 回答
7865 浏览

python - pybind 如何对 py::list 对象进行操作

为了更好地理解如何使用 pybind 库将参数从 Python 传递到 C++ 函数,我想构建一个小的虚拟/演示代码,我可以在其中接收 C++ 端的 Python 列表,将其转换为浮点指针对象,然后然后打印它。

虽然我知道我可以使用这个py::list类,但我还没有弄清楚这个类的可用方法。我查看了文档参考,然后查看了代码(list.h、stl.h),但无法确定哪些方法可用。

相当于__getitem__什么?我有所有可用的 python 方法py::list吗?

0 投票
2 回答
3011 浏览

python - 当嵌入式 Python 解释器再次尝试导入外部模块时,C++ 应用程序崩溃

如果我在不同的 pybind11::scoped_interpreter 会话中两次导入外部模块,则应用程序在函数 eval 中的 eval.h 中崩溃,如下行:

可重现的示例代码

我觉得这与 pybind11 的 embed.h 中的评论有关:

可以通过再次调用来重新启动解释器initialize_interpreter。使用 pybind11 创建的模块可以安全地重新初始化。但是,Python 本身不能完全卸载二进制扩展模块,并且在解释器重启方面有几个注意事项。所有详细信息都可以在 CPython 文档中找到。简而言之,由于引用循环或用户创建的全局数据,并非所有解释器内存都可以释放。

那么有没有办法两次调用Python解释器呢?我有一个 python 文件,其中包含我需要在 C++ 算法执行的不同点调用的辅助 numpy 函数。这是否意味着我不能这样做?