使用pybind11扩展和嵌入Python 3.5时出错

时间:2016-06-06 09:34:52

标签: python-3.x pybinding

我开始玩图书馆pybind11了。这是非常好的库,有很好的文档,它适用于我,但只适用于Python 2.7。我无法让它适用于Python 3.5并且我不知道我做错了什么。

这是我的“你好世界”计划:

#include <pybind11/pybind11.h>
namespace py = pybind11;

const char * world() { return "Hello world!"; }

int main(int argc, char ** argv) {

    Py_Initialize();

    py::module m("hello", "my hello world Python module with pybind11");
    m.def("world", &world);

    PyRun_SimpleString("import hello\nprint( hello.world() )");

    Py_Finalize();

    return 0;
}

如果我编译并链接2.7,我得到预期的结果:

Hello world!

但是如果我用Python 3.5链接完全相同的代码,加载模块时会出错。

Traceback (most recent call last):
  File "<string>", line 1, in <module>
ImportError: No module named 'hello'

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

你是如何编译库以及你使用的是什么系统的?如果您按照文档中的基本示例(下面的命令)中的建议使用了python-config,那么您将根据计算机上的开发版本进行编译。

 c++ -O3 -shared -std=c++11 -I <path-to-pybind11>/include `python-config --cflags --ldflags` example.cpp -o example.so

即使你使用Python 3.5,这很可能是Python 2.7。在我的例子中,我使用Anaconda来安装python,这给了我Python 3.5,但系统Python仍然是2.7。

python-config给你什么?该版本是否列出了Python 3.5?如果不是,则至少在没有修改的情况下不能使用此命令。您可以做的是cmake构建系统,如其文档中所述。这为我解决了这个问题。使用他们的setuptools系统可能也会起作用。基本上,他们弄清楚你用来编译他们的库并使用那些标志。这意味着,您必须确保在构建库本身时链接到Python 3.5。