【问题标题】:Extending C++ to Python using Pybind11使用 Pybind11 将 C++ 扩展到 Python
【发布时间】: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.pydexample.*.pyd

标签: python c++ visual-studio-2015 pybind11


【解决方案1】:

在 python 中,.pyd 文件的名称必须与里面的模块相同。来自文档(https://docs.python.org/2/faq/windows.html):

如果您有一个名为foo.pyd 的DLL,那么它必须有一个函数initfoo()。然后,您可以编写 Python “import foo”,Python 将搜索 foo.pyd(以及 foo.py、foo.pyc),如果找到,将尝试调用 initfoo() 来初始化它。

在您的代码中,您创建了一个名为 example 的 Python 模块,因此输出文件必须为 example.pyd

编辑:

pybind11 常见问题解答提到不兼容的 python 版本作为另一个可能的错误源 (https://pybind11.readthedocs.io/en/stable/faq.html):

ImportError:动态模块没有定义初始化函数

  1. 确保pybind::modulePYBIND11_PLUGIN 中指定的名称与扩展库的文件名一致且相同。后者不应包含任何额外的前缀(例如 test.so 而不是 libtest.so)。

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

【讨论】:

  • 对我来说,就是命名。原来它也区分大小写!
猜你喜欢
  • 2022-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-03
  • 2010-11-07
  • 1970-01-01
  • 2022-10-06
相关资源
最近更新 更多