Boost和Python 3.x

Ben*_*inB 23 c++ python boost boost-python python-3.x

boost.python如何处理Python 3?它只是Python 2吗?

hka*_*ser 16

较新版本的Boost应该可以与Python V3.x一起使用.很久以前就已经添加了这种支持,我相信在2009年成功推出Google Summer of Code项目之后.

将Python V3与Boost一起使用的方法是通过添加实例来正确配置构建系统:

using python : 3.1 : /your_python31_root ;
Run Code Online (Sandbox Code Playgroud)

到你的user-config.jam文件.

  • 如果它安装在系统上并且可检测(在通常的位置),您可以简单地执行 `./bootstrap.sh --with-python-version=XY`。如果没有,您可以在命令行上指定这些选项(而不是编辑文件)。见`./bootstrap.sh --help` (3认同)

Zen*_*del 7

需要使用python3构建libboostpython才能执行此操作.这不适用于boost 1.58(随Ubuntu 16.04一起提供),因此请确保下载最新的boost分配.我刚用boost_1_64_0做了这件事.

如上所述,在您的代码分发中找到文件"user-config.jam",并将其复制到$ HOME.

cp /path/to/boost_1_64_0/tools/build/example/user-config.jam $HOME
Run Code Online (Sandbox Code Playgroud)

然后编辑python行(最后一行),这样说:

using python : 3.5 : /usr/bin/python3 : /usr/include/python3.5m : /usr/lib ;
Run Code Online (Sandbox Code Playgroud)

这对于Ubuntu 16.04是正确的.您可以使用pkg-config查找正确的include目录.

user@computer > pkg-config --cflags python3
-I/usr/include/python3.5m -I/usr/include/x86_64-linux-gnu/python3.5m
Run Code Online (Sandbox Code Playgroud)

而且你只需要第一个包含目录.

然后从头开始构建boost.(抱歉.)我将它安装到/ usr/local

cd /path/to/boost_1_64_0
./bootstrap.sh --prefix=/usr/local
./b2 
sudo ./b2 install
Run Code Online (Sandbox Code Playgroud)

现在跳转到python示例目录,并构建教程

cd /path/to/boost_1_64_0/libs/python/example/tutorial
bjam
Run Code Online (Sandbox Code Playgroud)

如果你有一个系统安装boost,这将无法正确构建,因为在引擎盖下,bjam使用g ++参数"-lboost"链接到libboostpython.但是,在Ubuntu 16.04上,这将只是找到"/usr/lib/x86_64-linux-gnu/libboost_python-py27.so.1.58.0",然后python绑定将无法加载.事实上,你会得到他的错误:

ImportError: /usr/lib/x86_64-linux-gnu/libboost_python-py27.so.1.58.0: undefined symbol: PyClass_Type
Run Code Online (Sandbox Code Playgroud)

如果要查看bjam正在使用的g ++命令,请执行以下操作:

user@computer > bjam -d2 -a | grep g++
g++  -ftemplate-depth-128 -O0 -fno-inline -Wall -g -fPIC -I/usr/include/python3.5m -c -o "hello.o" "hello.cpp"
g++ -o hello_ext.so -Wl,-h -Wl,hello_ext.so -shared -Wl,--start-group hello.o  -Wl,-Bstatic  -Wl,-Bdynamic -lboost_python -ldl -lpthread -lutil -Wl,--end-group
Run Code Online (Sandbox Code Playgroud)

在这里我们看到问题,你需要在"-lboost_python"之前使用"-L/usr/includ/lib".因此,执行此操作以正确链接共享库:

g++ -o hello_ext.so -Wl,-h -Wl,hello_ext.so -shared -Wl,--start-group hello.o  -Wl,-Bstatic  -Wl,-Bdynamic -L/usr/local/lib -lboost_python -ldl -lpthread -lutil -Wl,--end-group
Run Code Online (Sandbox Code Playgroud)

您可能需要重新运行ldconfig(或重新启动)

sudo ldconfig
Run Code Online (Sandbox Code Playgroud)

你终于准备好了:

user@computer > python3
Python 3.5.2 (default, Nov 17 2016, 17:05:23) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import hello_ext
>>> hello_ext.greet()
'hello, world'
>>> exit()
Run Code Online (Sandbox Code Playgroud)


Nic*_*ark 7

是的,这个问题非常老了,但是我必须做一些这里的任何答案中都没有指定的事情(尽管它是根据一些建议构建的),所以我会快速记下我的整个过程:

  1. 下载boost_X_Y_Z.tar.bz2(我用的是boost 1.68.0)
  2. tar --bzip2 -xf boost_1_68_0.tar.bz2(您希望文件夹临时存放的位置)
  3. cd boost_1_68_0
  4. ./bootstrap.sh --with-python-version=3.6 --prefix=/usr/local
  5. ./b2
  6. sudo ./bjam install
  7. cp tools/build/example/user-config.jam $HOME,然后修改该文件的内容using python : 3.6 : /usr/bin/python3 : /usr/include/python3.6m : /usr/lib ;(或任何适合您环境的文件夹)

给定这个 C++ 源文件BoostPythonHelloWorld.cpp

#include <boost/python.hpp>

char const* say_hi()
{
    return "Hi!";
}

BOOST_PYTHON_MODULE(BoostPythonHelloWorld)
{
    boost::python::def("say_hi", say_hi);
}
Run Code Online (Sandbox Code Playgroud)

这个 Python 脚本BoostPythonHelloWorld.py

import BoostPythonHelloWorld
print(BoostPythonHelloWorld.say_hi())
Run Code Online (Sandbox Code Playgroud)

它可以这样编译和运行:

gcc -c -fPIC -I/path/to/boost_1_68_0 -I/usr/include/python3.6 /other_path/to/BoostPythonHelloWorld.cpp
gcc -shared -Wall -Werror -Wl,--export-dynamic BoostPythonHelloWorld.o -L/path/to/boost_1_68_0/stage/lib -lboost_python36 -o BoostPythonHelloWorld.so
python3 BoostPythonHelloWorld.py
Run Code Online (Sandbox Code Playgroud)

对我来说不同的部分是-Wl,--export-dynamic BoostPythonHelloWorld.o,我在其他地方没有看到过这一点,并且在添加该符号之前,我收到了有关未定义符号的 Python 错误。

希望这可以帮助某人!