【问题标题】:How to link to existing boost python module如何链接到现有的 boost python 模块
【发布时间】:2010-06-20 17:19:24
【问题描述】:

我断断续续地想知道这个问题,但我从来没有真正得到明确的答案。是否可以在 boost.python 框架内链接到另一个 boost.python 模块。

例如,我在 boost_python_module(libA) 中导出了类 A,在 boost_python_module(libB) 中导出了函数 B(A a)。是否可以在 libB 中指定链接到 libA 的 A。

看待这个问题的另一种方式是,现在我必须在一个模块中一次生成所有绑定。是否可以在多个 boost_python_module 上逐步生成绑定。

【问题讨论】:

  • 这个问题已经很老了,所以我不确定 boost 是否修复了某些问题,或者 OP 忽略了一些细节,但我在 boost 1.48 版本中没有观察到这种行为。当你分别编译两个使用相同类型的 boost::python 模块时,你可以将一个 boost python 模块创建的实例传递给另一个 boost python 模块定义的函数。

标签: c++ boost boost-python


【解决方案1】:

Boost.Python 处理您所要求的方法是将包划分为编译单元 as explained in the tutorial,然后在实际声明模块的主编译单元中进行合并。

您不能在 Boost.Python 中链接独立的模块,因为它们声明了特定的 Python 入口点,这些入口点在您加载模块时由 Python 执行。例如,如果 binary 模块名称是 mod.so,Python 解释器将查找名为 init_mod 的函数(这是 BOOST_PYTHON_MODULE(mod) 声明的)并执行该函数的代码。在该函数的代码中,它期望找到对象(实例、类等)的 Python C-API 声明。

例如,如果您将mod.so 二进制文件链接到另一个模块二进制文件(例如foo.so),则当Python 加载mod.so 时,它将找到并执行init_mod并将忽略init_foo

【讨论】:

    【解决方案2】:

    我不太了解共享库,但对我有用的是在 python 中导入我所有可以相互引用的模块:import libA; import libB

    当然可以将这些导入文件放在__init__.py 文件中,这样您只需要在 python 中执行以下操作:import myLib

    【讨论】:

    • 嗨 rafak,问题的发生是因为 libA 和 libB 以及 c++ 代码的包装器。如何将从 libA 创建的对象传递给 libB 中的函数。 -桑迪普
    • 如果我理解正确,我可以做你想做的事。我认为导出类型有某种全局寄存器。所以我会首先导入libA(libB依赖于它,因为它使用A类)然后是libB。你得到什么错误(如果有的话)?
    • 我相信我实际上有同样的问题 - 我有多个相互关联的不同 boost::python 项目。在一个中定义的类型似乎在另一个中不可用,在 Python 中。我收到“No to_python (by-value) converter found for C++ type”错误。如果我从同一个扩展模块包装,这些就会消失......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 2015-06-21
    • 2018-12-04
    • 2013-02-09
    相关资源
    最近更新 更多