使用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
相关产品推荐
相关产品推荐

