Boost未向Python暴露模块求助:无法导入自定义C++扩展模块
解决Boost.Python模块无法导入的问题
我来帮你搞定这个问题——你现在遇到的ModuleNotFoundError核心原因是只完成了C++代码的编译步骤,没有把目标文件链接成Python可识别的共享库,所以Python找不到你的hello_ext模块。
问题分析
你执行的命令:
g++ -c hello.cpp -I/usr/include/python3.6/
仅仅生成了hello.o目标文件,而Python需要的是后缀为.so的共享库文件(Linux系统下),而且文件名必须和你在BOOST_PYTHON_MODULE(hello_ext)里定义的模块名完全一致,也就是hello_ext.so。
正确的编译链接步骤
执行这条完整的编译链接命令,生成符合要求的共享库:
g++ -shared -fPIC hello.cpp -o hello_ext.so -I/usr/include/python3.6/ -lboost_python3
这里每个参数的作用:
-shared:告诉编译器生成共享库而非可执行文件-fPIC:生成位置无关代码,这是共享库的必需属性-o hello_ext.so:指定输出文件名为hello_ext.so,必须和模块名匹配-lboost_python3:链接Boost.Python针对Python3的库(如果你的系统里库名是boost_python36这类带版本号的,可以用find /usr/lib -name "libboost_python3*.so"命令查找准确的库名,替换成对应的,比如-lboost_python36)
测试验证
- 执行上面的命令后,你会在当前目录得到
hello_ext.so文件 - 把你的测试脚本
hello.py和这个.so文件放在同一个目录下 - 运行
python3 hello.py,就能看到输出hello, world了
额外注意事项
- 如果后续遇到模块能导入但无法访问函数的情况,确实要检查Python是否有同名的内置模块,避免被优先加载
- 如果你把模块代码移到了头文件,记得在cpp文件里包含该头文件,并且确保
BOOST_PYTHON_MODULE的定义只出现在一个源文件中,否则会出现链接冲突
内容的提问来源于stack exchange,提问作者Sam Rappl
相关产品推荐
相关产品推荐

