wake-up-neo.net

Boost und Python 3.x

Wie geht boost.python mit Python 3 um? Ist es nur Python 2?

21
BenjaminB

Neuere Versionen von Boost sollten mit Python V3.x problemlos funktionieren. Diese Unterstützung wurde vor einiger Zeit hinzugefügt, glaube ich nach einem erfolgreichen Google Summer of Code-Projekt im Jahr 2009.

Um Python V3 mit Boost zu verwenden, müssen Sie das Build-System ordnungsgemäß konfigurieren, indem Sie beispielsweise Folgendes hinzufügen:

using python : 3.1 : /your_python31_root ;

in deine user-config.jam Datei.

14
hkaiser

dazu muss libboostpython mit python3 erstellt werden. Dies funktioniert nicht mit Boost 1.58 (das mit Ubuntu 16.04 geliefert wird), also stellen Sie sicher, dass Sie die neueste Boost-Distribution herunterladen. Ich habe das gerade mit boost_1_64_0 gemacht.

Suchen Sie, wie oben erwähnt, die Datei "user-config.jam" in Ihrer Boost-Codeverteilung und kopieren Sie sie nach $ HOME.

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

Bearbeiten Sie dann die Python-Zeile (die letzte Zeile), so dass heißt:

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

Dies ist korrekt für Ubuntu 16.04. Sie können pkg-config verwenden, um das richtige Include-Verzeichnis zu finden.

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

Und Sie brauchen nur das erste Include-Verzeichnis.

Dann bauen Sie Boost von Grund auf neu. (Entschuldigung.) Ich installiere es nach/usr/local

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

Wechseln Sie nun in das Python-Beispielverzeichnis und erstellen Sie das Tutorial

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

Dies wird nicht korrekt erstellt, wenn Sie eine Systeminstallation von boost haben, da bjam unter der Haube mit dem g ++ - Parameter "-lboost" eine Verknüpfung zu libboostpython herstellt. Unter Ubuntu 16.04 wird jedoch "/usr/lib/x86_64-linux-gnu/libboost_python-py27.so.1.58.0" gefunden, und die Python-Bindungen können nicht geladen werden. In der Tat erhalten Sie seinen Fehler:

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

Wenn Sie die von bjam verwendeten g ++ - Befehle sehen möchten, gehen Sie wie folgt vor:

[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

Hier sehen wir das Problem, Sie brauchen "-L/usr/includes/lib" kurz vor "-lboost_python". Führen Sie dies aus, um die gemeinsam genutzte Bibliothek korrekt zu verknüpfen:

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

Möglicherweise müssen Sie ldconfig erneut ausführen (oder neu starten)

Sudo ldconfig

Und endlich kann es losgehen:

[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()
5
Zendel

Wenn du "error: No best alternative for/python_for_extension" bekommst, sei dir sicher

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

nur in user-config.jam in deinem Home-Pfad und nirgendwo anders. Verwenden Sie doppelte Backslashes, wenn Sie unter Windows mit mingw (toolset = gcc) oder MSVC (toolset = msvc) kompilieren. Kompilieren Sie mit cmd und nicht mit msys. Wenn Sie auch Python 2.7 installiert haben, entfernen Sie das aus PATH in dieser Shell. Zuerst machen

bootstrap.bat gcc/msvc

vorausgesetzt, Sie haben die gcc/msvc-Tools über PATH verfügbar (/ für die Alternativen, aber verwenden Sie nur eine oder lassen Sie weg)

Danach können Sie auch tun

booststrap.sh --with-bjam=b2

in msys, um eine project-config.jam zu generieren, müssen diese aber bearbeiten, um die Befehle "using python" und "/ usr" zu entfernen.

Dann das Folgende

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

Mit static haben die Python-Quickstart-Beispiele bei mir nicht funktioniert, obwohl ich lieber auf die boost_python-dll verzichten möchte.

Ich habe Linux nicht ausprobiert, aber es sollte dort einfacher sein.

4
Roland Puntaier

Ja, diese Frage ist super alt, aber ich musste etwas tun, das in keiner der Antworten hier angegeben wurde (obwohl es auf einigen der Vorschläge aufbaut), also werde ich schnell meinen gesamten Prozess aufschreiben:

  1. Laden Sie boost_X_Y_Z.tar.bz2 herunter (ich habe boost 1.68.0 verwendet)
  2. tar --bzip2 -xf boost_1_68_0.tar.bz2 (wo der Ordner temporär sein soll)
  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, ändern Sie dann den Inhalt dieser Datei, um using python : 3.6 : /usr/bin/python3 : /usr/include/python3.6m : /usr/lib ; (oder welche Ordner auch immer für Ihre Umgebung geeignet sind)

Angesichts dieser C++ - Quelldatei BoostPythonHelloWorld.cpp:

#include <boost/python.hpp>

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

BOOST_PYTHON_MODULE(BoostPythonHelloWorld)
{
    boost::python::def("say_hi", say_hi);
}

Und das Python script BoostPythonHelloWorld.py:

import BoostPythonHelloWorld
print(BoostPythonHelloWorld.say_hi())

Es kann wie folgt kompiliert und ausgeführt werden:

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

Der Teil, der für mich anders war, war -Wl,--export-dynamic BoostPythonHelloWorld.o, Ich hatte das nirgendwo anders gesehen, und ich bekam einen Python Fehler bezüglich eines undefinierten Symbols, bis ich das hinzufügte.

Hoffe das hilft jemandem auf der ganzen Linie!

1
Nick Vandemark

Wenn der Pfad zu Python Leerzeichen enthält, sind Sie auf einer ziemlichen Fahrt. Nach vielen Versuchen und Irrtümern habe ich es endlich geschafft, etwas zu finden, das funktioniert. Siehe meinen user-config.jam (der sich in meinem Home-Verzeichnis befinden muss, damit bjam ihn findet):

import toolset : using ;

using python : 3.6
         : \"C:\\Program\ Files\ (x86)\\Microsoft\ Visual\ Studio\\Shared\\Python36_64\\python.exe\"
         : C:\\Program\ Files\ (x86)\\Microsoft\ Visual\ Studio\\Shared\\Python36_64\\include
         : C:\\Program\ Files\ (x86)\\Microsoft\ Visual\ Studio\\Shared\\Python36_64\\libs
         ;

Das inkonsistente Zitat ist beabsichtigt und scheint erforderlich zu sein. Damit kann ich Boost-Python erstellen und als Boost::python36 in meinem CMakeLists.txt verwenden. Dennoch bleibt ein Problem: Ich muss nämlich manuell auf Python verlinken

target_link_libraries(MyTarget
    Boost::boost Boost::python36
"C:/Program Files (x86)/Microsoft Visual Studio/Shared/Python36_64/libs/python36.lib")
target_include_directories(MyTarget PRIVATE
    "C:/Program Files (x86)/Microsoft Visual Studio/Shared/Python36_64/include")
1
tobi_s

Lesen Sie dies , um zu wissen, wie man boost mit python erstellt. Es zeigt den Weg zum Erstellen mit python2 mit Visual Studio 10.0 (2010). Bei einem Projekt, an dem ich gerade arbeite, gehe ich jedoch genauso vor und es funktioniert einwandfrei mit Python 3.5 und Visual Studio 14.1 (2017).

Wenn Sie diesen Fehler beim Erstellen Ihres Python-Boost-Projekts erhalten, fügen Sie einfach den Wert BOOST_ALL_NO_LIB zu Preprocessor Definitions (in der Registerkarte C\C++> Präprozessor) in Ihren Projekteigenschaften hinzu.
Vergessen Sie auch nicht, Ihrem Systempfad den Speicherort für boost .dll-Dateien hinzuzufügen.

0
Ramesh-X