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

使用PyBind11+CMake生成C++ Python绑定后无法导入模块求助

问题:PyBind11生成的Python模块导入失败(ModuleNotFoundError)

编译基于slang库的PyBind11绑定代码后,生成的.so文件无法被Python3.7导入,抛出ModuleNotFoundError: No module named 'slangparser',且生成的库文件名带有python3.6m后缀,与当前使用的Python版本不符。

工作目录结构

toolsuite
--- CMakeLists.txt
--- build/debug/build
--- deps
    --- slang
    --- pybind11
--- src
    --- pybind_wrapper.cpp
    --- slangparser.cpp

存在的问题及修复方案

1. CMakeLists.txt中的拼写错误

target_link_libraries指令存在拼写错误,模块名slangarser应为slangparser,与pybind11_add_module定义的名称一致:

# 原错误代码
target_link_libraries(slangarser PUBLIC slang::slang)

# 修复后
target_link_libraries(slangparser PUBLIC slang::slang)

2. 关联正确的Python3.7版本

生成的库带有python3.6m后缀,说明CMake绑定了系统默认的Python3.6而非指定的3.7。调整CMake配置,明确指定Python版本:

  • 替换find_package(PythonLibs REQUIRED)为find_package(Python 3.7 EXACT REQUIRED COMPONENTS Development),PyBind11会自动沿用此版本配置
  • 移除CMAKE_PREFIX_PATH的bin目录指向,改为指向Python3.7的完整安装目录(如/net/sw/python/3.7.4),或直接删除该配置让CMake自动匹配

修正后的CMake开头段:

cmake_minimum_required(VERSION 3.6)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)

project(slang_toolsuite)

find_package(Python 3.7 EXACT REQUIRED COMPONENTS Development)
add_subdirectory(deps/slang)
add_subdirectory(deps/pybind11)

pybind11_add_module(slangparser SHARED ${CMAKE_CURRENT_SOURCE_DIR}/src/pybind_wrapper.cpp)
target_link_libraries(slangparser PUBLIC slang::slang)

3. 解决模块导入路径问题

Python无法定位到.so文件,可通过以下方式处理:

  • 将生成的slangparser*.so复制到Python脚本所在目录
  • 在Python脚本中手动添加模块路径:
    import sys
    sys.path.append("/path/to/toolsuite/build/debug/build")
    import slangparser
    
  • 配置CMake的安装规则,将模块安装到Python的site-packages目录

4. 修正绑定代码的头文件引用

直接包含.cpp文件是错误做法,应改为包含对应的头文件(若slangparser.cpp有配套slangparser.h):

#include "pybind11/pybind11.h"
#include "slangparser.h"  // 替换原有的#include "slangparser.cpp"
namespace py = pybind11;

PYBIND11_MODULE(slangparser, m) {
    m.def("slangParser", &slangParser, "C++ function");
}

若没有头文件,需将slangparser.cpp加入CMake的源文件列表:

pybind11_add_module(slangparser SHARED 
    ${CMAKE_CURRENT_SOURCE_DIR}/src/pybind_wrapper.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/src/slangparser.cpp
)

5. 验证生成的模块文件名

修复Python版本关联后,生成的.so文件名应带有python3.7m后缀(对应Python3.7标识)。若需快速验证,可临时将文件重命名为slangparser.so(不推荐长期使用)。

内容的提问来源于stack exchange,提问作者Yadu Krishnan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 18:13:29