python - Boost不将模块暴露给python
问题描述
我正在使用我在网上找到的一些示例代码来尝试设置 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 还没有具有相同名称的默认模块,该模块将优先于您的模块。
解决方案
根据boost::python
文档,您的代码应编译为要在 python 中使用的共享库:
g++ hello.cpp -I /usr/include/python3.6 -lboost_python-py36 -shared -fPIC -o hello_ext.so
请注意,共享库的名称必须与您的 python 模块的名称相同。您还忘记将您的代码与 boost lib 链接。
推荐阅读
- flutter - 将 QuerySnapshot 数据传递给 TabView,以便我可以在每个选项卡的页面中访问它
- c++ - 如何将 `boost::thread_specific_ptr` 与 `for_each` 一起使用
- python - 其他 BoxLayouts 中的 KIVY BoxLayout
- google-dfp - 为什么我会收到“无效的 GPT 固定大小规范”
- c# - 用 LINQ 计算距离,问题“无法翻译”。
- c# - 无法使用 Selenium Chrome 驱动程序 c# 启动窗口
- python - 无法找到按钮 facebook 登录的元素
- javascript - 在Javascript中将数组中的值映射到另一个数组中的值
- regex - 需要验证“ST21072231”的正则表达式
- javascript - Babel如何在代码中添加新行或换行符?