问题标签 [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.
python - 使用不同的 Python 工具接口 C/C++
所以我正在做一个项目,需要我编写一些 python 代码来接口 C/C++ 程序,但我还没有决定我应该使用哪个工具。直观地说,我想在pybind11和Boost.Python之间进行选择。程序员:两者的优缺点是什么?您将如何决定使用哪一个?
python - 在 pybind11 中引用 C++ 分配的对象
我正在尝试使用 pybind11 创建一个 python 绑定,该绑定引用一个 C++ 实例,该实例的内存在 C++ 端处理。这是一些示例代码:
我被困在如何创建 pythonexample.dog
和 C++dog
变量之间的链接上。
我不能使用py:class_<Dog>.def(py::init<>())
,因为它会分配一个新的实例Dog
,这不是我想要的。
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
任何关于可能发生的事情的想法都非常受欢迎。
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?
pybind11 - 如何使用 pybind11 包装单例类?
我在 C++ 中有一个单例类(没有公共构造函数,C++ 程序员调用 class.instance() 来创建单例或返回现有的)。
我更愿意在 Python 级别隐藏它。如果我正在编写 Python 单例,我会在__new__
. 如果一个类没有公共构造函数,我认为我不能创建一个__init__
包装器(我的尝试失败了)。__new__
我在 pybind11 文档中没有看到任何提及(尽管可能错过了它,而且 Google 似乎很乐意忽略包含“新”的返回页面,但没有提及__new__
)。
pybind11(甚至 Boost.Python)有单例配方吗?
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 文件供参考:
python - 使用 pybind11 在 C++ 中嵌入 Python,分段错误
我正在尝试使用 pybind11 将 Python嵌入到 C++ 中。Embedding 比extension受到的关注要少得多,而且有用的资源也很难找到。
这是我天真的代码
没有这kwargs
条线,一切看起来都很好。有了它,我就犯了错误。
一个疯狂的猜测是我需要以某种方式delete或decref kwargs
,Python 没有使用它。
任何指针表示赞赏。
c++ - 使用 python3-config 进行 Pybind11 编译不起作用
我想使用 Pybind11 将一个简单的 C++ 函数集成到 Python 中。考虑以下虚拟函数的简单示例:
我将此代码存储在名为 example.cpp 的函数中,我使用 Python 3.5.2 和 Anaconda。按照官方文档,我编译脚本如下:
我不确切知道“python-config”部分代表什么,但我知道它会导致问题。我尝试了三个选项:
- python-config:这会导致 clang 错误,链接器命令失败
- python3-config:与 python-config 相同的问题
python3.4-config:这实际上有效并创建了一个 example.so 文件。但是当我尝试从 python3.5 加载它时,我得到了错误
致命的 Python 错误:PyThreadState_Get:没有当前线程
总之,我的问题是:如何编译我的代码,以便我可以从 python3.5 加载它?或者更准确地说:我必须用什么来替换“python-config”语句?
c++ - 使用 pybind11 从 c++ 调用 Python 函数
我正在尝试从包含main()
函数的 C++ 代码中调用 python 函数Pybind11
。但我发现很少有可用的参考资料。大多数现有文档都在谈论相反的方向,即从 Python 调用 C++。
有没有完整的例子展示如何做到这一点?我找到的唯一参考是:https ://github.com/pybind/pybind11/issues/30
但它的信息很少。
python - 需要哪个 $path 以便 g++/pybind11 可以找到 Python.h?
我开始使用pybind11
(在带有Python 2.7的Ubuntu 16.04上)。
为了试水,我在我的 c++ 库周围创建了一个无操作的包装器。唉,编译找不到Python.h
:
但是,我似乎确实有文件:
我应该更正哪个(路径?)以便g++
能够找到Python.h
?
笔记: