You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 12:52:21