我有一些用c++编写的代码,我试图在python中使用这些代码,而不需要再次重写python中的完整代码,并且我正在使用Pybind11来构建一个python模块。我正试图在Microsoft 2015中实现这一目标,方法是在这里遵循本教程https://pybind11.readthedocs.io/en/stable/basics.html
我在视听演播室做了跟踪。1)从Pybind11下载的https://codeload.github.com/pybind/pybind11/zip/master
2)解压缩文件
3)在visual中,a启动了一个新的空C++项目。
4)在Pybind11目录> VC++目录中添加了python解释器包含文件夹(C:/python 27/ include )和VC++(C:/Pybind11 11/ include )
5)在Linker>input>Additional依赖项中添加了附加依赖项(C:\Python27 27\libs\python27.lib)
6)要在Python中使用输出文件,我需要一个.pyd文件,因此我在这里修改了配置Properties>General>Target扩展名:.pyd
7)将项目默认值>配置类型更改为动态库(.dll)
因此,我能够构建我的项目并生成.pyd文件,但是当导入这个模块时,我得到了以下错误: ImportError: dynamic模块不定义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();
}发布于 2017-07-12 10:36:26
在python中,.pyd文件的名称必须与内部的模块相同。来自文档(https://docs.python.org/2/faq/windows.html):
如果您有一个名为
foo.pyd的DLL,那么它必须有一个函数initfoo()。然后您可以编写Python“导入foo”,Python将搜索foo.pyd (以及foo.py、foo.pyc),如果它找到它,将尝试调用initfoo()来初始化它。
在您的代码中,您创建了一个名为example的python模块,因此输出文件必须是example.pyd。
编辑:
pybind11 FAQ提到一个不兼容的python版本是另一个可能的错误源(https://pybind11.readthedocs.io/en/stable/faq.html):
ImportError:动态模块不定义init函数
pybind::module和PYBIND11_PLUGIN中指定的名称是一致的,并且与扩展库的文件名相同。后者不应包含任何额外的前缀(例如,test.so而不是libtest.so)。https://stackoverflow.com/questions/45054860
复制相似问题