conta's diary

思ったこと、やったことを書いてます。 twitter: @conta_

Boost.Pythonで自作モジュールを呼び出すときにエラーが出る問題の解決

Boost.Pythonc++で書いたモジュールをPythonで使った時に発生した問題の解決策メモ

環境

  • Mac OSX 10.9
  • python 2.7.6 (brewでインストール)
  • boost 1.55.0

エラー内容

モジュールをインポートして、自作関数を呼ぶと、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はなかなか使いにくい(´・ω・`)