Boost.Pythonで自作モジュールを呼び出すときにエラーが出る問題の解決
Boost.Pythonでc++で書いたモジュールをPythonで使った時に発生した問題の解決策メモ
環境
エラー内容
モジュールをインポートして、自作関数を呼ぶと、abortでPythonが落ちる
Fatal Python error: PyEval_SaveThread: NULL tstate
というエラー
エラーが起きるまで
ビルド設定
. . . FIND_PACKAGE(PythonLibs REQUIRED) include_directories(${PYTHON_INCLUDE_DIRS}) message(STATUS " python includes dir: ${PYTHON_INCLUDE_DIRS}") message(STATUS " python libs: ${PYTHON_LIBRARIES}") . . .
Cmakeした時のログ。
-- python includes dir: /System/Library/Frameworks/Python.framework/Headers -- python libs: /usr/lib/libpython2.7.dylib
あれ、おかしい。デフォルトのPython使ってる。
動かしてみる。
Fatal Python error: PyEval_SaveThread: NULL tstate [1] 52771 abort python
なんかHomebrewでインストールしたPythonだとfind_package(PythonLibs)がうまく働かないみたい。 cmake find_package(PythonLibs) broken with brewed python on 10.9 · Issue #25118 · Homebrew/homebrew · GitHub
このエラーは、実行環境と違うPythonライブラリ(Macに入ってるデフォルトのPythonとHomebrewでインストールしたPython)がはいってると起きるらしい。(ソースがどこかわからなくなった。。。
とりあえずの解決策
無理やりパスを通してあげましょう。
set(PYTHON_INCLUDE_DIRS "/usr/local/Cellar/python/2.7.6_1/Frameworks/Python.framework/Versions/Current/include/python2.7/") set(PYTHON_LIBRARIES "/usr/local/Cellar/python/2.7.6_1/Frameworks/Python.framework/Versions/Current/lib/libpython2.7.dylib") include_directories(${PYTHON_INCLUDE_DIRS}) message(STATUS " python includes dir: ${PYTHON_INCLUDE_DIRS}") message(STATUS " python libs: ${PYTHON_LIBRARIES}”)
とりあえず動きました。 Homebrewで入れたPythonはなかなか使いにくい(´・ω・`)