1

我开始玩图书馆pybind11。这是一个非常好的库,有据可查,它适用于我,但仅适用于 Python 2.7。我无法让它为 Python 3.5 工作,我不知道我做错了什么。

这是我的“hello world”程序:

#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'

有任何想法吗?

4

1 回答 1

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。

于 2016-08-15T22:49:48.057 回答