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)
在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:动态模块未定义初始化函数
确保在
pybind::module和中指定的名称PYBIND11_PLUGIN与扩展库的文件名一致且相同。后者不应包含任何额外的前缀(例如,用test.so代替libtest.so)。如果上述方法不能解决您的问题,则可能是使用了不兼容的Python版本(例如,扩展库是针对Python 2编译的,而解释器则在某些版本的Python 3上运行,反之亦然)