13

我有一些用 c++ 编写的代码,我试图在 python 中使用而无需再次在 python 中重写完整的代码,我正在使用 Pybind11 来构建一个 python 模块。我正在尝试通过在此处遵循本教程https://pybind11.readthedocs.io/en/stable/basics.html在 Microsoft Visual Studio 2015 中实现此目的

我在视觉工作室做了以下事情。1) 从https://codeload.github.com/pybind/pybind11/zip/master下载 Pybind11

2)解压文件

3) 在visual studio a 中开始了一个新的空C++ 项目。

4)在VC++目录>包含目录中添加了我的python解释器包含文件夹(C:/python27/include)和Pybind11(C:/Pybind11/include)

5) 在Linker>input>Additional dependencies中添加了额外的依赖(C:\Python27\libs\python27.lib)

6) 要在 Python 中使用输出文件,我需要一个 .pyd 文件,所以我在这里修改了配置属性>常规>目标扩展名:.pyd

7) 将项目默认值 > 配置类型更改为动态库 (.dll)

所以我能够构建我的项目并生成 .pyd 文件,但是在导入此模块时出现以下错误:ImportError: dynamic module does not define init function (initProject11)

我搜索了这个错误并得到了这个链接http://pybind11.readthedocs.io/en/stable/faq.html 但我找不到我的解决方案。

所以我正在寻找上述问题的解决方案。提前非常感谢。

这是我的 CPP 文件代码

#include <pybind11/pybind11.h>

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

namespace py = pybind11;

PYBIND11_PLUGIN(example) {
    py::module m("example", "pybind11 example plugin");

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

    return m.ptr();
}
4

1 回答 1

12

在 python 中,.pyd文件的名称必须与里面的模块相同。从文档(https://docs.python.org/2/faq/windows.html):

如果你有一个名为的 DLL foo.pyd,那么它必须有一个函数initfoo()。然后,您可以编写 Python “import foo”,Python 将搜索 foo.pyd(以及 foo.py、foo.pyc),如果找到,将尝试调用initfoo()以对其进行初始化。

在您的代码中,您创建了一个名为 的 python 模块example,因此输出文件必须是example.pyd.

编辑:

pybind11 FAQ 提到了不兼容的 python 版本作为另一个可能的错误源(https://pybind11.readthedocs.io/en/stable/faq.html):

ImportError:动态模块未定义初始化函数

  1. 确保和中指定的名称pybind::modulePYBIND11_PLUGIN扩展库的文件名一致且相同。后者不应包含任何额外的前缀(例如 test.so 而不是 libtest.so)。

  2. 如果上述方法没有解决您的问题,那么您可能使用了不兼容的 Python 版本(例如,扩展库是针对 Python 2 编译的,而解释器是在某些版本的 Python 3 之上运行的,反之亦然)

于 2017-07-12T10:36:26.397 回答