问题标签 [boost-python]
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 - Boost.Python 函数指针作为类构造函数参数
我有一个 C++ 类,它的构造函数中需要一个函数指针 ( float(*myfunction)(vector<float>*)
)
我已经向 Python 公开了一些函数指针。
使用这个类的理想方式是这样的:
所以我像这样告诉 Boost 这个类:
但我得到:
当我尝试编译它时。
那么,有没有人知道如何在不失去从函数指针获得的灵活性的情况下修复错误(即不回退到指示要调用哪个函数的字符串)?
此外,用 C++ 编写此代码的主要目的是为了速度。因此,如果我仍然能够保持这种好处,那就太好了(函数指针在初始化期间被分配给一个成员变量,并且稍后将被调用超过一百万次)。
c++ - 在 C++ 类中注册 python 可调用对象
我正在用 python 编写一个程序,它应该能够传递在 C++ 类中注册的“callables”。到目前为止,我已经编写了以下代码:
C++:
Python/C API:
代码可以编译,但是当我从 python 调用该方法时,传递一个可调用的(在我的情况下是另一个实例方法),我收到以下运行时错误:
我想我需要一种方法来告诉 boost 他可以在每次需要 boost::function 时安全地传递一个可调用对象。如果我使用手工制作的解决方案,一切正常:
由于我只有几个像这样的寄存器功能,我可以坚持使用手工制作的解决方案(使用宏来帮助),但我想知道如何告诉 boost::python 自动进行转换。查看文档,我发现了 to_python_converter 指令,具有讽刺意味的是,它与我需要的完全相反......
c++ - Boost.Python 是如何工作的?
当解释器是 C 并且使用 C 编译器构建时,Python 如何调用 C++ 对象?
c++ - Boost.Python 方法返回的字符串被截断,意外的整数值
我正在使用 Boost.Python 来公开 JRA 的BWRepLib所以我可以尝试在 python 中对 sc:bw 重播进行一些数据挖掘,但我遇到了一个从 C++ 方法返回的值的小问题。当运行任何旧的简单程序(例如教程)时,我会得到返回给 python 的预期值(一个“hello,world”字符串,打印得很好)。但是,当我运行 bwreplib 程序时,我遇到了所有字符串都被截断并且某些整数返回方法返回意外值的问题。例如,在一次回放中,C++ 中的玩家名称正确返回,因为玩家 1 是 SlayerS_'BoxeR',玩家 2 是 iloveoov。然而,在 python 中打印出来的值是 erS_'Boxer' 和 eoov,缺少最初的 4 个字节/字符。另一个例子是玩家种族,它应该是整数值 1、2、3 或 6,但是我得到更大的不相关值,例如 97,120、111 和 78 但是某些值(例如 120 和 97)应该是同一个种族,并且在纯 C++ 程序中返回相同的值。正如我看到的数字之间没有二进制相关性,我怀疑这可能也被 python 中的一个单词所抵消,并从不同的位置返回一个值?有没有人遇到过类似的问题?
我对使用 Boost.Python 很陌生,而不是 C++ 专家。我可以发布包装器,但是除了公开诸如
我怀疑我应该做一些特别的事情来包装我没有做的功能。但是在线搜索并阅读文档我找不到那会是什么,但是我相信一旦我发现它就会非常明显。
编辑:日志输出
python - boost::python: Python 列表到 std::vector
最后,我可以使用 [] 运算符在 python 中使用 std::vector 。诀窍是在 boost C++ 包装器中简单地提供一个容器来处理内部向量内容:
另一个挑战是:如何将 python 列表转换为 std::vectors?我尝试添加一个期望 std::vector 作为参数的 c++ 类,并添加了相应的包装器代码:
但如果这样做,我最终会得到以下 Boost.Python.ArgumentError:
谁能告诉我如何在我的 c++ 函数中访问 python 列表?
谢谢,丹尼尔
python - 在 Mac 上构建 Python 库并遇到平面命名空间错误
作为一般规则,每当我必须在 Mac 上构建 Python 库时,我都会后悔。我在使用 Boost::Python 时通常取得了相当不错的成功,如果我使用 distutils,大多数情况下一切正常。
但是,我一直无法弄清楚哪些有效/哪些无效的确切组合。具体来说,我经常遇到找不到符号的可怕问题,因为我尝试使用的库没有平面命名空间。我尝试切换到 Python 的 MacPorts 版本,然后只使用 MacPorts 库,而不使用骰子。
我最近遇到的问题是我需要使用的工具依赖于 OpenCV 库,而 OpenCV 库又依赖于 FFMPeg 库(实际上,两者都是)。一切都可以编译,但是当我执行“导入 MYLIB”时,我得到了在平面名称空间中找不到的符号 _pix_fmt_info。我执行 DYLIB_LIBRARY_PRINT 来查看所有加载的库,果然 libavformat、libavcodec、libavutil 和 libswscale 都已加载。
所以,这是我的问题。具体问题是,有没有人知道这里可能发生了什么。我需要手动构建 libffmpeg 吗?我是否在做一些非常愚蠢的事情,比如忘记图书馆(我检查过,我不认为我是......)
更一般地说,是否有处理平面命名空间问题的好方法?我是否总是需要担心包含哪些库?有没有人有一个让事情正常工作的好方法?
有时我确实想念 Linux 的世界。
编辑
抱歉,看来这是我自己的愚蠢过错了。我还没有弄清楚确切的问题,但看起来未找到的符号与我属于不同的库(即不是 libffmpeg)。
但是,我仍然对其他人使用平面命名空间的体验感到好奇。
python - 如何防止 boost::python::extract从接受 int
我正在使用 boost::python::extract<> 将 boost::python::list 中的项目转换为浮点数。我的问题是 python 中的 int -extract<float>
似乎将 int->float 视为有效转换,但我只想要真正的浮点对象。有没有办法强制 extract<> 更加保守?
makefile - 使用带有 make 而不是 bjam 的 boost.python
我只是想编译 boost.python 的“hello world”示例,而不使用所有 bjam 魔法。我的 boost.python 安装工作正常,我用 bjam 成功构建了示例并通过了测试套件。
现在对于我的项目,我需要在一个简单的 Make 环境中使用所有这些东西。我不想移植到另一个构建工具。
所以我天真的方法当然是将包含路径指向正确的标题并链接到正确的库。我将 boost python 构建为系统布局、静态、运行时静态,这意味着它只是一个位于 /usr/local/lib 中的 libboost_python.a。
不幸的是,我在生成的 .so 库中得到了未解析的外部符号。
这是我尝试从 libs/python/example/tutorial/hello.cpp 构建示例:
那么,当 bjam 链接 libboost_python.a 时,我没有得到未定义的符号,但是当我“手动”执行时,我得到了这些,bjam 的最大魔力是什么?
python - boost::python: 如何调用需要指针的函数?
我有一个函数,它接受一个 int 指针并通过 boost::python 公开它。如何从 python 调用这个函数?
在带有 boost::python 的 C++ 中:
在蟒蛇中:
结果是
那么如何传递指针呢?
c++ - 使用 Boost.Python 将 Python 转换为 C++ 函数
我有一堆用 C++ 编写的类和 API,并在 Boost.Python 的帮助下暴露于 Python
我目前正在研究创建以下架构的可能性。
在蟒蛇中:
在 C++ 中:
基本上,我试图将所有功能都归结为程序的本机部分。问题是我不确定是否可以从 Boost 元信息中提取所有必需的数据以通用方式执行此操作 - 在编译时我不应该知道我将调用哪些函数以及它们接受哪些参数。
几个问题:
1. 我可以访问任何共享的 Python 信息表来检查这些东西吗?
2. Boost.Python 进行类型参数检查。可以单独重复使用吗?
让我知道你的想法。
谢谢