2009年8月25日火曜日

Boost::Pythonでshared_ptrを使う術

Boost::Pythonでshared_ptrを使うには、先に宣言しよう。
BOOST_PYTHON_MODULE(gaga)
{
boost::python::register_ptr_to_python<boost::shared_ptr >();
boost::python::class_("gigi")
.def("gugu", &gugu)
;
...
...
}

2009年8月22日土曜日

Boost::Python

Boost::Pythonはソースに手を入れなければならないと思われているがそんなことはない。サンプルがそのようであるからで、実際にはヘッダーファイルをインクルードしたラッパーを書けば1丁上がりである。元になるライブラリがDLLならラッパーだけのDLLができてライブラリのDLLを読みに行ってくれる。すなわち軽量。しかもラッパーはC++のソースだからわかりやすい。Python以外のLLにポートしないのならSwigよりおすすめです。

2009年8月20日木曜日

Boost::Pythonに泣く

pythonの拡張をC++でしようと思ってubuntuでやっていたことをVC++に持っていくとpython25.dllがないと怒られた。そんなもん使ってないのになんでいるんだとしばらく毒づいていた。
ふと気づいて、dependencywalkerで見てみると、なんとboost::pythonのライブラリが依存していた。そうそう、このライブラリ構築したのはpython25のときでした。「スマンカッタ。」
そこでboostライブラリの再構築。しかし時間かかるなーあ。complete指定だと優に1時間かかったが、こんどはエラー吐かなくなった。目出度しめでたし。

2009年8月8日土曜日

pythonのsetup.pyにswigでC++のオプションを付けるの術

from distutils.core import setup, Extension

setup(
ext_modules = [
Extension('_example', ['example.i', 'example.cxx', 'sample.cxx'],
library_dirs=[],
libraries=[],
extra_compile_args=[],
extra_link_args=[],
swig_opts=["-c++"],)
])

VS2005でpythonの拡張を行うの術(まとめ)

prebuildされたpython25はVS7.1、python26はVS2008でコンパイルされているためVS2005しか持っていないときはsetup.pyでbuildすることはできない。(たぶん)
これを回避するには、
1)VS2005でdllを作ってしまう。
2)mingwを導入する
3)VS7.1もしくはVS2008を導入する。
4)sourceよりpythonをコンパイルして自分の物とする。
と言う方法が考えられる。
ここでは1)についてまとめる。

手順は次のとおり。
1)VS2005でdllを作成できるようにする。(以前のエントリが少し助けになる。)
2)dllを作成し、名前を[package_name].pydに変更する。
3)C:Python26/DLLsの下に[package_name].pydと[package_name].py置く。
4)importしてみる。

おまけ。
prebuildされたpythonにはpython26_d.libは含まれていない。C,C++でpythonインタープリターを使いたいときdebugが必要なら、sourceを引っ張ってきてコンパイルしてできたpython26_d.libをC:Python26/libsの下へ入れればよい。

cmakeでリンクするファイルをdebugとreleaseでカエルの術

昨日のエントリから
target_link_libraries(example debug boost_python-vc80-mt-gd-1_39 debug ${PYTHON_DEBUG_LIBRARIES}
optimized boost_python-vc80-mt-1_39 optimized ${PYTHON_LIBRARIES})
とそれぞれのライブラリにdebugもしくはoptimizedをつければよい。

2009年8月6日木曜日

windows上でC++でpython拡張するの術

example.i, example.h, example.cppを作ってコマンドラインから
Cだけなら
$ swig -python example.i
C++なら
$ swig -c++ -python example.i
とすると
example_wrap.cxx
とexample.pyができる。

CMakeList.txtにむにゃむにゃと
#-----------------------------------------------------------------------------
set (BoostPython_SRCS
example.cxx
example.h
example.i
example_wrap.cxx
)
#-----------------------------------------------------------------------------
add_library(example SHARED ${BoostPython_SRCS})
target_link_libraries(example debug boost_python-vc80-mt-gd-1_39 debug ${PYTHON_DEBUG_LIBRARIES}
optimized boost_python-vc80-mt-1_39 optimized ${PYTHON_LIBRARIES})
target_link_libraries(example boost_python-vc80-mt-gd-1_39 ${PYTHON_LIBRARIES} )
#-----------------------------------------------------------------------------
何てやってから、ビルドするとexample.dllができる。

できたexample.dllを_example.pydと名前を変えてC:Python26/DLLsの下に置く。
ついでにexample.pyもそこへ置く。

後は、
$ python
>>>import example
>>>
と読み込めればOK
VS2005でコンパイルしてもOK