我开始玩图书馆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'
有什么想法吗?
答案 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。