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

python - 使用不同的 Python 工具接口 C/C++

所以我正在做一个项目,需要我编写一些 python 代码来接口 C/C++ 程序,但我还没有决定我应该使用哪个工具。直观地说,我想在pybind11Boost.Python之间进行选择。程序员:两者的优缺点是什么?您将如何决定使用哪一个?

0 投票
3 回答
4410 浏览

python - 在 pybind11 中引用 C++ 分配的对象

我正在尝试使用 pybind11 创建一个 python 绑定,该绑定引用一个 C++ 实例,该实例的内存在 C++ 端处理。这是一些示例代码:

我被困在如何创建 pythonexample.dog和 C++dog变量之间的链接上。

我不能使用py:class_<Dog>.def(py::init<>()),因为它会分配一个新的实例Dog,这不是我想要的。

0 投票
1 回答
487 浏览

python - 将元素从一个出队移动到另一个出队时,C++ 使用两倍的内存

在我的项目中,我使用pybind11将 C++ 代码绑定到 Python。最近我不得不处理非常大的数据集(70GB+),并且遇到了需要从std::deque多个std::deque's 之间拆分数据。由于我的数据集非常大,我希望拆分不会有太多的内存开销。因此,我选择了一波一推的策略,这通常可以确保满足我的要求。

这都是理论上的。在实践中,我的进程被杀死了。所以我在过去的两天里一直在努力,最终想出了以下最小的例子来证明这个问题。

通常,最小示例会在 (~11GB) 中创建一堆数据deque,将其返回给 Python,然后再次调用 toC++以移动元素。就那么简单。移动部分在执行器中完成。

有趣的是,如果我不使用 executor,内存使用量与预期相同,并且当 ulimit 对虚拟内存施加限制时,程序确实尊重这些限制并且不会崩溃。

测试.py

测试.cpp

测试/__init__.py

编译

观察:

  • 当移动部分不是由 executor 完成时,我们只需调用moved_numbers = _test.move(numbers),一切都按预期工作,htop 显示的内存使用情况保持不变11Gb,太棒了!
  • 在执行器中完成移动部分时,程序会占用双倍的内存并崩溃。
  • 当引入虚拟内存限制(~15Gb)时,一切正常,这可能是最有趣的部分。

    ulimit -Sv 15000000 && python3.5 test.py>> Done!.

  • 当我们增加限制时,程序崩溃(150Gb > 我的 RAM)。

    ulimit -Sv 150000000 && python3.5 test.py>>[1] 2573 killed python3.5 test.py

  • 使用 deque 方法shrink_to_fit没有帮助(也不应该)

用过的软件

笔记

请注意,此示例仅用于演示问题。发生问题需要 asyncio和的使用。pybind

任何关于可能发生的事情的想法都非常受欢迎。

0 投票
1 回答
1519 浏览

boost-python - pybind11 equivalent of boost::python::extract?

I am considering port of a complex code from boost::python to pybind11, but I am puzzled by the absence of something like boost::python::extract<...>().check(). I read pybind11::cast<T> can be used to extract c++ object from a py::object, but the only way to check if the cast is possible is by calling it and catching the exception when the cast fails. Is there something I am overlooking?

0 投票
3 回答
1972 浏览

pybind11 - 如何使用 pybind11 包装单例类?

我在 C++ 中有一个单例类(没有公共构造函数,C++ 程序员调用 class.instance() 来创建单例或返回现有的)。

我更愿意在 Python 级别隐藏它。如果我正在编写 Python 单例,我会在__new__. 如果一个类没有公共构造函数,我认为我不能创建一个__init__包装器(我的尝试失败了)。__new__我在 pybind11 文档中没有看到任何提及(尽管可能错过了它,而且 Google 似乎很乐意忽略包含“新”的返回页面,但没有提及__new__)。

pybind11(甚至 Boost.Python)有单例配方吗?

0 投票
1 回答
182 浏览

python - PYBIND11_PLUGIN 已经有主体了

我有一个问题,我需要帮助来寻找解决方案。

我目前在做什么

我正在尝试使用 PyBind11 将几个变量从 C++ 发送到 Python(然后用于记录 sql 数据,但这不是重点)。我将使用以下过程执行此操作:

SQL_Service.cpp:

这一切都很好,我能够将这两个变量(bet_player 和 total_winnings)放入 python 并处理它们。

我想创建另一个关联的“PYBIND11_PLUGIN(somethingelse)”,它使用不同的变量并与不同的 python 脚本关联。

当我尝试定义另一个 PYBIND11_PLUGIN 时出现问题。即:

我希望完成的事情

我想使用我的类(SQL_Service)来定义各种函数,这些函数将从我的程序中的其他地方接收数据,打包并发送到不同的 python 脚本,每个脚本只获取它需要的数据。(请参阅下面我的完整示例中的 Process_Baccarat(...){...} )。

是什么绊倒了我

我依赖于各种教程,这些教程提供了一小段代码,或者演示了使用 PyBind 做事的方式略有不同。因此,我真的不知道如何得到我正在寻找的东西。

我不确定它是命名空间,或者我不能拥有其中的两个功能。也许还有另一种更好的方法来完全解决这个问题。

我对不得不使用全局变量也不太满意(同样,我有一些命名空间混乱)所以如果有一种方法可以很好地包裹起来,那就是我正在寻找的。工作示例代码将不胜感激。

这是我的完整(工作)SQL_Service.cpp 文件供参考:

0 投票
1 回答
1400 浏览

python - 使用 pybind11 在 C++ 中嵌入 Python,分段错误

我正在尝试使用 pybind11 将 Python嵌入到 C++ 中。Embedding 比extension受到的关注要少得多,而且有用的资源也很难找到。

这是我天真的代码

没有这kwargs条线,一切看起来都很好。有了它,我就犯了错误。

一个疯狂的猜测是我需要以某种方式deletedecref kwargs,Python 没有使用它。

任何指针表示赞赏。

0 投票
1 回答
1492 浏览

c++ - 使用 python3-config 进行 Pybind11 编译不起作用

我想使用 Pybind11 将一个简单的 C++ 函数集成到 Python 中。考虑以下虚拟函数的简单示例:

我将此代码存储在名为 example.cpp 的函数中,我使用 Python 3.5.2 和 Anaconda。按照官方文档,我编译脚本如下:

我不确切知道“python-config”部分代表什么,但我知道它会导致问题。我尝试了三个选项:

  1. python-config:这会导致 clang 错误,链接器命令失败
  2. python3-config:与 python-config 相同的问题
  3. python3.4-config:这实际上有效并创建了一个 example.so 文件。但是当我尝试从 python3.5 加载它时,我得到了错误

    致命的 Python 错误:PyThreadState_Get:没有当前线程

总之,我的问题是:如何编译我的代码,以便我可以从 python3.5 加载它?或者更准确地说:我必须用什么来替换“python-config”语句?

0 投票
3 回答
10452 浏览

c++ - 使用 pybind11 从 c++ 调用 Python 函数

我正在尝试从包含main()函数的 C++ 代码中调用 python 函数Pybind11。但我发现很少有可用的参考资料。大多数现有文档都在谈论相反的方向,即从 Python 调用 C++。

有没有完整的例子展示如何做到这一点?我找到的唯一参考是:https ://github.com/pybind/pybind11/issues/30

但它的信息很少。

0 投票
1 回答
4147 浏览

python - 需要哪个 $path 以便 g++/pybind11 可以找到 Python.h?

我开始使用pybind11(在带有Python 2.7的Ubuntu 16.04上)。

为了试水,我在我的 c++ 库周围创建了一个无操作的包装器。唉,编译找不到Python.h

但是,我似乎确实有文件:

我应该更正哪个(路径?)以便g++能够找到Python.h


笔记: