2011-04-04 22 views
17

¿Cómo lidia boost.python con Python 3? ¿Es solo Python 2?Boost y Python 3.x

+1

Parece que Están trabajando en eso. http://www.boost.org/doc/libs/1_46_0/libs/python/doc/news.html – mkaes

Respuesta

13

Las versiones más recientes de Boost deberían funcionar bien con Python V3.x. Este apoyo se ha añadido hace bastante tiempo, creo que después de un exitoso proyecto Google Summer of Code en 2009.

La manera de utilizar Python V3 con Boost es configurar correctamente el sistema de construcción mediante la adición de, por ejemplo:

using python : 3.1 : /your_python31_root ; 

a su archivo user-config.jam.

4

Si aparece "Error: No mejor alternativa para/python_for_extension" Asegúrese de tener

using python : 3.4 : C:\\Python34 : C:\\Python34\\include : C:\\Python34\\libs ; 

only in user-config.jam en su camino a casa y en ninguna otra parte. Utilice barras diagonales inversas dobles cuando compile bajo Windows con mingw (toolset = gcc) o MSVC (toolset = msvc). Compile con cmd, no con msys, y si también tiene instalado python 2.7, elimínelo de PATH en ese shell. En primer lugar hacer

bootstrap.bat gcc/msvc 

suponiendo que tiene las herramientas gcc/MSVC disponibles a través de PATH (/ de las alternativas, pero el uso de sólo uno, o deje de distancia)

Después también se puede hacer

booststrap.sh --with-bjam=b2 

en MSYS para generar un proyecto de config.jam, pero que editar para eliminar el "uso de Python" y "/ usr", ..

a continuación, el siguiente

b2 variant=debug/shared link=static/shared toolset=gcc/msvc > b2.log 

Con estática, los ejemplos de inicio rápido de python no me funcionaron, aunque preferiría prescindir de la dll boost_python.

No probé con Linux, pero debería ser más sencillo.

0

Consulte this para saber cómo compilar boost con python. Muestra la forma de compilar con python2 con Visual Studio 10.0 (2010). Pero sigo el mismo procedimiento para un proyecto en el que estoy trabajando actualmente y funciona bien con Python 3.5 y Visual Studio 14.1 (2017).

Si obtiene this error en la construcción de su proyecto de pitón impulso, sólo tiene que añadir valor a BOOST_ALL_NO_LIBPreprocessor Definitions (dentro de C \ C++> pestaña preprocesador) en las propiedades del proyecto.
Y también, no olvide agregar la ubicación de archivos boost .dll a la ruta del sistema.

3

libboostpython debe construirse con python3 para poder hacerlo. Esto no funciona con boost 1.58 (que viene con Ubuntu 16.04), así que asegúrese de descargar la última distribución de boost. Acabo de hacer esto con boost_1_64_0.

Como se mencionó anteriormente, busque el archivo "user-config.jam" en la distribución del código de impulso y cópielo en $ HOME.

cp /path/to/boost_1_64_0/tools/build/example/user-config.jam $HOME 

A continuación, edite la línea pitón (la última línea) por lo que es dice:

using python : 3.5 : /usr/bin/python3 : /usr/include/python3.5m : /usr/lib ; 

Esto es correcto para Ubuntu 16.04. Puede usar pkg-config para encontrar el directorio de inclusión correcto.

[email protected]puter > pkg-config --cflags python3 
-I/usr/include/python3.5m -I/usr/include/x86_64-linux-gnu/python3.5m 

Y solo necesita el primer directorio de inclusión.

A continuación, cree un impulso desde el principio. (Lo siento.) Se instala en/usr/local

cd /path/to/boost_1_64_0 
./bootstrap.sh --prefix=/usr/local 
./b2 
sudo ./b2 install 

Ahora salta en el directorio ejemplo pitón, y construir el tutorial

cd /path/to/boost_1_64_0/libs/python/example/tutorial 
bjam 

Esto no construirá correctamente si usted tiene un sistema de instalación de impulsar, porque, bajo el capó, bjam se está vinculando a libboostpython utilizando el parámetro g ++ "-lboost". Pero, en Ubuntu 16.04, esto irá y encontrará "/usr/lib/x86_64-linux-gnu/libboost_python-py27.so.1.58.0", y luego no se podrán cargar los enlaces de python. De hecho, obtendrá su error:

ImportError: /usr/lib/x86_64-linux-gnu/libboost_python-py27.so.1.58.0: undefined symbol: PyClass_Type 

Si desea ver el g ++ ordena que bjam está utilizando, haga lo siguiente:

[email protected] > 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 

Aquí vemos el problema, es necesario "- L/usr/includ/lib "justo antes" -lboost_python ". Así ejecutar esta enlazar la librería compartida correctamente:

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 

Es posible que tenga que volver a ejecutar ldconfig (o reiniciar)

sudo ldconfig 

Y usted está finalmente listo para ir:

[email protected] > 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() 
+0

esto fue totalmente útil para mí. la clave para hacer que mi proyecto se construya con un todo personalizado (gcc, python3, boost) fue editar mi archivo 'project-config.jam', como usted indicó. a saber, para ajustar la línea 'using python: ...' para listar cada uno de los ejecutables binarios para el intérprete python3, la carpeta de inclusión para él y el directorio lib. Después de reconstruir el impulso y la instalación, mi proyecto se compila correctamente utilizando Python 3. ¡Gracias! – ofloveandhate