简单的 pybind11 模块失败,没有命名模块

Posted

技术标签:

【中文标题】简单的 pybind11 模块失败,没有命名模块【英文标题】:Simple pybind11 module fails with No module named 【发布时间】:2019-11-11 04:47:43 【问题描述】:

不久前,我为我的一个项目创建了一个 python 绑定,现在想再次使用它。 绑定不再起作用,因为 python 不再能够导入它 - 这一切都在当时工作正常。

然后我决定将其分解为最简单的示例:

binding.cpp

#include <pybind11/pybind11.h>

int add(int i, int j) 
    return i + j;


PYBIND11_MODULE(TestBinding, m) 
    m.doc() = "pybind11 example plugin"; // optional module docstring

    m.def("add", &add, "A function which adds two numbers");

CMakeLists.txt:

cmake_minimum_required( VERSION 3.2 )

project(TestBinding)

add_subdirectory(pybind11)  # or find_package(pybind11)

pybind11_add_module(TestBinding binding.cpp)

# Configure project to inject source path as include directory on dependent projects
target_include_directories( TestBinding
    INTERFACE
        $<BUILD_INTERFACE:$CMAKE_CURRENT_SOURCE_DIR>
        $<BUILD_INTERFACE:$CMAKE_CURRENT_SOURCE_DIR/pybind11/include/> )

set_target_properties( TestBinding
  PROPERTIES
  CXX_STANDARD 17
  CXX_STANDARD_REQUIRED ON
  PREFIX ""
  SUFFIX ".so"
)

然后我有一个非常简单的 test.py 文件,如下所示:

sys.path.insert(0, "/path/to/so/lib/")
from TestBinding import *

...一旦执行总是给我以下错误:

    from TestBinding import *
ModuleNotFoundError: No module named 'TestBinding'

我真的不知道世界上会发生什么变化,从它运行良好到现在。

以下是有关我的工作环境的更多信息:

Windows 10 Visual Studio 15 2017 Win64 Python 3.7(也尝试过 3.5 和 3.6)

我错过了什么非常明显的东西吗?

【问题讨论】:

【参考方案1】:

我已经能够通过从我的CMakeLists.txt 中删除SUFFIX ".so" 规则来解决此问题。 这在我最初创建绑定时需要,但显然不再需要。

【讨论】:

以上是关于简单的 pybind11 模块失败,没有命名模块的主要内容,如果未能解决你的问题,请参考以下文章

拆分 pybind11 模块和自动类型转换的问题

尝试导入 pybind opencv 模块时出现 libgtk 错误

基于pybind11为C++提供Python接口

Pybind11:外部类型作为返回值

返回多个 py::array 而不在 pybind11 中复制

未定义符号:导入 pybind11 绑定时的 _ZN3a13A