Boost不将模块暴露给python

Posted

技术标签:

【中文标题】Boost不将模块暴露给python【英文标题】:Boost not exposing module to python 【发布时间】:2019-06-09 05:52:25 【问题描述】:

我正在使用我在网上找到的一些示例代码来尝试设置 libboost,以便我可以使用 Python 代码调用 cpp 例程。 (我打算使用 python 为这个应用程序的后端编写我的 UI 和 cpp)Boost 看起来很简单易用,但它目前没有公开任何功能。

#include <boost/python.hpp>

char const* greet()

    return "hello, world";


BOOST_PYTHON_MODULE(hello_ext)

    using namespace boost::python;
    def("greet", greet);

我使用行 g++ -c hello.cpp -I/usr/include/python3.6/ 编译它 (最后一个包含是必要的,因为我在 ubuntu 上,g++ 没有正确定位 python,我懒得将它添加到我的路径中)

import hello_ext
print(hello_ext.greet())

我使用 python3 运行它,我得到以下输出

  File "hello.py", line 1, in <module>
    import hello_ext
ModuleNotFoundError: No module named 'hello_ext'

这对我来说意味着 Boost 没有正确公开我为其创建模块的 C++ 功能。我在这里想念什么?我已经尝试在头文件中而不是在 cpp 文件中将功能公开给 python,结果相同。

另外,如果查看这篇文章的任何人在访问其模块中的功能时遇到问题,但似乎该模块已被暴露,请确保 python 还没有具有相同名称的默认模块,该模块将优先于你的模块。

【问题讨论】:

【参考方案1】:

根据boost::pythondocs,您的代码应编译为共享库,以便在python中使用:

g++ hello.cpp -I /usr/include/python3.6 -lboost_python-py36 -shared -fPIC -o hello_ext.so

请注意,共享库的名称必须与您的 python 模块的名称相同。您还忘记将您的代码与 boost lib 链接。

【讨论】:

以上是关于Boost不将模块暴露给python的主要内容,如果未能解决你的问题,请参考以下文章

如何让不同的 Docker 容器相互通信而不将端口暴露给全世界

Boost.Python - 暴露一个类

在 boost python 中暴露 C++ 接口

Boost.Python 列出所有暴露的类和属性

删除由 boost::python 暴露的 std::vector 中的一个指针

Boost Python 暴露 C++ 类,构造函数采用 std::list