我将 Boost.Python 中的 .so 文件放在哪里,以便我可以将其作为模块导入,以及如何将它与 Python 2 和 3 一起使用

Sum*_*ith 5 c++ python boost boost-python python-3.x

我在名为 cpp_examples 的文件夹中有以下文件。

#include <boost/python.hpp>
#include <string>

const std::string hello() {
return std::string("hello, zoo");
}

BOOST_PYTHON_MODULE(zoo) {
// An established convention for using boost.python.
using namespace boost::python;
def("hello", hello);
}
Run Code Online (Sandbox Code Playgroud)

我运行以下命令进行编译。

sumith@rztl516-Lenovo-G575:~/cpp_examples$ g++ zoo.cpp -I/usr/include/python2.7 -I/usr/lib/x86_64-linux-gnu/ -lboost_python  -lpython2.7 -o zoo.so -shared -fPIC
Run Code Online (Sandbox Code Playgroud)

它被编译并给了我一个 zoo.so 文件。当我尝试在同一个文件夹中导入和运行 zoo.hello() 时,它可以工作,但没有在 cpp_examples 文件夹外导入

sumith@rztl516-Lenovo-G575:~/cpp_examples$ python2
Python 2.7.6 (default, Oct 26 2016, 20:30:19) 
[GCC 4.8.4] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import zoo
>>> zoo.hello()
'hello, zoo'
>>> exit()
Run Code Online (Sandbox Code Playgroud)

以下是 cpp_examples 文件夹之外的内容。

sumith@rztl516-Lenovo-G575:~$ python2
Python 2.7.6 (default, Oct 26 2016, 20:30:19) 
[GCC 4.8.4] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import zoo
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named zoo
>>> 
Run Code Online (Sandbox Code Playgroud)

未导入该文件夹的原因可能是什么?。在编译时我检查了 python3 它根本没有编译,我在上面的命令中将 -lpython2.7 更改为 -lpython3.4 并将 -I/usr/include/python2.7 更改为 I/usr/include/python3.4 但是它在编译时给我错误

/usr/bin/ld: cannot find -lpython3.4
Run Code Online (Sandbox Code Playgroud)

如果我能得到这两个问题的答案,那将是一个很大的帮助。谢谢你。

Jim*_*ard 2

正如@Omnifarious 最初在评论中所述,您应该查看其中存在的目录sys.path以查找可以放置.so文件的位置。import当找到语句时,Python 默认会在此处查找。

当您在包含 的目录中运行 Python 时.so,它很容易找到它,因为第一个条目sys.path实际上是当前目录。

至于链接,您通常应该提供给您的标志,如在类 Unix 系统下编译和链接pythonX.Y-config --ldflags部分中所述。

文档中的示例还提供了使用 Python 的示例输出3.4

$ /opt/bin/python3.4-config --ldflags
-L/opt/lib/python3.4/config-3.4m -lpthread -ldl -lutil -lm -lpython3.4m -Xlinker -export-dynamic
Run Code Online (Sandbox Code Playgroud)