cmake 为CPP代码创建Python绑定,然后将其导入Python脚本

8i9zcol2  于 2023-03-12  发布在  Python
关注(0)|答案(1)|浏览(224)

我尝试为一些使用现有C库创建的C代码创建Python绑定。我使用PyBind 11和CMake构建绑定并将其转换为共享库(.so),以便可以直接导入到Python脚本中。创建绑定并构建库后,导入到脚本中会引发ModuleNotFoundError: No module named 'slangparser'错误。
我的工作目录如下所示:

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

我已将基目录中的CMakeLists.txt文件配置为如下所示:

cmake_minimum_required(VERSION 3.6)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_PREFIX_PATH "/net/sw/python/3.7.4/bin")
set(CMAKE_POSITION_INDEPENDENT_CODE ON)

project(slang_toolsuite)

find_package (PythonLibs REQUIRED)
include_directories (${PYTHON_INCLUDE_DIRS})

add_subdirectory(deps/slang)
add_subdirectory(deps/pybind11)

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

target_link_libraries(slangarser PUBLIC slang::slang)

我要运行的C++代码包含在slangparser.cpp中,将此代码 Package 到绑定中的粘合代码存在于pybindwrapper.cpp中,如下所示:

#include "pybind11/pybind11.h"
#include "slangparser.cpp"
namespace py = pybind11;

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

我不确定问题出在哪里,这个项目是用VSCode构建的,没有任何问题,可以放到/build/debug/build文件夹中。我只是无法将生成的.so库中的slangparser模块导入到我的Python脚本中。我能得到一些帮助吗?谢谢!
另外,生成的.so库的文件名为python3.6m,而不是我使用的python3.7。这可能是问题的线索吗?

hmae6n7t

hmae6n7t1#

我不知道你是否使用pybind 11作为静态库,如果是这样,那么我发送的CMakeLists.txt代码片段就足以调用 Package 器了。

cmake_minimum_required(VERSION 3.20)

project(Project LANGUAGES CXX C)
set(ENV{Path} PATH)

add_subdirectory("{pybind11Path}\\pybind11")
add_subdirectory("{srcPath}\\srcFolder")

pybind11_add_module(Project {srcPath}/src.cpp)

关于PYBIND11_MODULE您需要在源文件中调用它,您希望用Python Package 它,至少这样可以工作。下一点是关于Python分发沿着必须存在于环境路径中的dev-tools,因为pybind 11调用Python.h时没有这个文件,所以不可能使用pybind 11。最后,我发送了pybind 11的link教程。请按照它,这是相当不错的,根据我的经验。祝你好运!!

相关问题