首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用C++将Pybind11扩展到Python

使用C++将Pybind11扩展到Python
EN

Stack Overflow用户
提问于 2017-07-12 10:16:15
回答 1查看 7.7K关注 0票数 15

我有一些用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文件代码

代码语言:javascript
复制
#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();
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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函数

  1. 确保pybind::modulePYBIND11_PLUGIN中指定的名称是一致的,并且与扩展库的文件名相同。后者不应包含任何额外的前缀(例如,test.so而不是libtest.so)。
  2. 如果上面没有解决您的问题,那么您可能使用不兼容的Python版本(例如,扩展库是针对Python 2编译的,而解释器运行在Python 3的某个版本之上,反之亦然)
票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45054860

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档