web-dev-qa-db-ja.com

ブーストとPython 3.x

Boost.pythonはPython 3をどのように扱いますか?それはPython 2のみですか?

25
BenjaminB

Boostの新しいバージョンは、Python V3.xで正常に動作するはずです。このサポートはかなり前に追加されました。2009年のGoogle Summer of Codeプロジェクトが成功した後、私は信じています。

Python V3 with Boostを使用する方法は、たとえば、以下を追加してビルドシステムを適切に構成することです。

using python : 3.1 : /your_python31_root ;

user-config.jamファイルに追加します。

17
hkaiser

これを行うには、libboostpythonをpython3でビルドする必要があります。 これは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

次に、python行(最後の行))を編集して、次のようにします。

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

これは、Ubuntu 16.04では正しいです。 pkg-configを使用して、正しいインクルードディレクトリを見つけることができます。

user@computer > pkg-config --cflags python3
-I/usr/include/python3.5m -I/usr/include/x86_64-linux-gnu/python3.5m

そして、必要なのは最初のインクルードディレクトリだけです。

その後、最初からブーストを構築します。 (申し訳ありません。)/ usr/localにインストールします

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

python exampleディレクトリにジャンプして、チュートリアルをビルドします

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

ブーストのシステムインストールがある場合、これは正しくビルドされません。なぜなら、内部では、bjamがg ++パラメーター "-lboost"を使用してlibboostpythonにリンクしているためです。しかし、Ubuntu 16.04では、これは単に "/usr/lib/x86_64-linux-gnu/libboost_python-py27.so.1.58.0"を見つけ、python bindings willロードに失敗しました。実際には、彼のエラーが表示されます:

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

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

ここに問題が表示されます。「-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

Ldconfigを再実行(または再起動)する必要があるかもしれません

Sudo ldconfig

そして、あなたは最終的に行く準備ができています:

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()
9
Zendel

「エラー:/ python_for_extensionの最善の代替案はありません」が表示された場合は、

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

ser-config.jamのみ ホームパスにあり、他にはありません。ウィンドウの下でmingw(toolset = gcc)またはMSVC(toolset = msvc)を使用してコンパイルする場合は、二重バックスラッシュを使用してください。 msysではなくcmdでコンパイルし、python 2.7もインストールしている場合は、シェルのPATHから削除します。最初に

bootstrap.bat gcc/msvc

pATH経由でgcc/msvcツールを使用できると仮定します(/は代替手段ですが、1つだけ使用するか、そのままにします)

その後、あなたも行うことができます

booststrap.sh --with-bjam=b2

msysでproject-config.jamを生成しますが、「pythonを使用する」と「/ usr」を削除するように編集する必要があります。

次に、

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

Staticの場合、pythonクイックスタートの例は機能しませんでしたが、boost_python dllなしで実行したいと思います。

私はLinuxを試したわけではありませんが、そこではもっと簡単なはずです。

4
Roland Puntaier

はい、この質問は非常に古いですが、私はここでの回答のいずれにも指定されていないことをしなければならなかったので(いくつかの提案に基づいて作成されました)、プロセス全体をすぐに書き留めておきます。

  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);
}

そして、PythonスクリプトBoostPythonHelloWorld.py

import BoostPythonHelloWorld
print(BoostPythonHelloWorld.say_hi())

このようにコンパイルして実行できます。

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

私にとって違っていたのは-Wl,--export-dynamic BoostPythonHelloWorld.o、それ以外の場所では見たことがなく、追加するまで未定義のシンボルに関するPythonエラーが発生しました。

これが将来の誰かに役立つことを願っています!

1
Nick Vandemark

Python=へのパスにスペースが含まれている場合、かなりの乗り心地になります。多くの試行錯誤を経て、ようやく機能するものを手に入れることができました。user-config.jambjamがホームディレクトリにあることを確認してください):

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
         ;

一貫性のない引用は意図されており、必要と思われます。これでb​​oost-pythonをビルドし、Boost::python36CMakeLists.txtとして使用できます。それでも、1つの問題が残ります。python手動でvizにリンクする必要があります

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

boostpythonでビルドする方法については、 this を参照してください。 Visual Studio 10.0(2010)でpython2を使用してビルドする方法を示しています。しかし、私は現在取り組んでいるプロジェクトに対して同じ手順を実行し、python 3.5およびVisual Studio 14.1(2017)で正常に動作します。

python boostプロジェクトのビルド時に このエラー が発生した場合は、BOOST_ALL_NO_LIB値をPreprocessor Definitions(C\C++>プリプロセッサタブ内)に追加するだけです。プロジェクトのプロパティ。
また、システムパスにboost .dllファイルの場所を追加することを忘れないでください。

0
Ramesh-X