macOS下pybind11编译模块后无法导入example的问题求助
pybind11模块导入失败问题解决
问题背景
按以下步骤操作后遇到ModuleNotFoundError:
- 创建并激活Python虚拟环境:
python3.10 -m venv venv source venv/bin/activate pip install pybind11 - 编写
example.cpp代码:#include <pybind11/pybind11.h> int add(int i, int j) { return i + j; } PYBIND11_MODULE(example, m) { m.doc() = "pybind11 example plugin"; // 可选模块文档字符串 m.def("add", &add, "一个用于相加两个数字的函数"); } - 编译时添加
-undefined dynamic_lookup解决arm64架构未定义符号错误,生成example.cpython-39-darwin.so文件 - 导入模块时触发错误:
>>> import example Traceback (most recent call last): File "<stdin>", line 1, in <module> ModuleNotFoundError: No module named 'example'
环境信息:macOS 12.2.1、Python 3.10.5、pybind11 2.10.4、Apple clang 13.0.0
解决方法
1. 修正编译命令,匹配Python版本
生成的cpython-39后缀对应Python3.9,但当前使用的是Python3.10,版本不匹配导致无法识别。使用以下命令编译,自动适配当前Python版本:
c++ -O3 -Wall -shared -std=c++11 -undefined dynamic_lookup $(python3 -m pybind11 --includes) example.cpp -o example$(python3-config --extension-suffix)
执行后会生成类似example.cpython-310-darwin.so的文件,与当前Python版本匹配。
2. 确保模块在Python搜索路径内
Python只能找到位于其搜索路径中的模块,可通过以下方式解决:
- 将生成的
.so文件放在运行Python命令的当前工作目录下 - 或通过环境变量添加路径:
export PYTHONPATH=$PYTHONPATH:/存放so文件的目录路径 - 或在Python代码中临时添加路径:
import sys sys.path.append("/存放so文件的目录路径") import example
3. 确认虚拟环境一致性
检查编译和运行时使用的Python是否为同一个虚拟环境:
which python3
输出应为venv/bin/python3,确保没有混用系统Python或其他虚拟环境的Python。
内容的提问来源于stack exchange,提问作者mascai
相关产品推荐
相关产品推荐

