使用Pybind11将C++扩展到Python

fla*_*ite 9 c++ python visual-studio-2015 pybind11

我有一些用c ++编写的代码,我试图在python中使用而不再重写python中的完整代码,我使用Pybind11为它构建一个python模块.我试图通过以下教程在Microsoft Visual Studio 2015中实现此功能https://pybind11.readthedocs.io/en/stable/basics.html

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

2)解压缩文件

3)在visual studio中,启动了一个新的空C++项目.

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

5)在链接器>输入>附加依赖项中添加了其他依赖项(C:\ Python27\libs\python27.lib)

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

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

所以我能够构建我的项目并生成.pyd文件但是在导入这个模块时我收到以下错误:ImportError:动态模块没有定义init函数(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();
}
Run Code Online (Sandbox Code Playgroud)

psc*_*ill 7

在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::module和中指定的名称PYBIND11_PLUGIN与扩展库的文件名一致且相同。后者不应包含任何额外的前缀(例如,用test.so代替libtest.so)。

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