我尝试为一些使用现有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。这可能是问题的线索吗?
1条答案
按热度按时间hmae6n7t1#
我不知道你是否使用pybind 11作为静态库,如果是这样,那么我发送的
CMakeLists.txt
代码片段就足以调用 Package 器了。关于
PYBIND11_MODULE
您需要在源文件中调用它,您希望用Python Package 它,至少这样可以工作。下一点是关于Python分发沿着必须存在于环境路径中的dev-tools,因为pybind 11调用Python.h
时没有这个文件,所以不可能使用pybind 11。最后,我发送了pybind 11的link教程。请按照它,这是相当不错的,根据我的经验。祝你好运!!