【发布时间】:2017-12-16 17:09:54
【问题描述】:
我有一些用 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 中,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: 动态模块没有定义初始化函数 (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();
}
【问题讨论】:
-
您是否将 C++ 项目留空?或者您是否使用
PYBIND11_PLUGIN(...) {...}之类的东西添加了任何 python 模块。 -
我没有使用Pybind,但是一般来说,你的init函数名和你的模块(文件)名好像不匹配。
-
不,我用C++写了最基本的代码
-
@YiFei 你能解释一下init函数在哪里使用吗?
-
生成的.pyd文件叫什么名字?它应该与模块名称匹配,例如
example.pyd或example.*.pyd。
标签: python c++ visual-studio-2015 pybind11