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++"],)
])
2009年8月8日土曜日
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の下へ入れればよい。
これを回避するには、
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をつければよい。
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
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})
#-----------------------------------------------------------------------------
何てやってから、ビルドするとexample.dllができる。
できたexample.dllを_example.pydと名前を変えてC:Python26/DLLsの下に置く。
ついでにexample.pyもそこへ置く。
後は、
$ python
>>>import example
>>>
と読み込めればOK
VS2005でコンパイルしてもOK
2009年7月29日水曜日
vtkImagePlaneWidgets
vtkImagePlaneWidgetsでvtkCellPickerで取得した値がwindowの下に隠れて見えない。
しかたがないのでソースを読むが分からんかった。
対症療法だが、GenerateText()メソッドの中の
coord->SetValue(.01, .01);
を
coord->SetValue(0.01, 0.05);
に変えて見えるようになった。
と思ったら、別のパネルに貼り付ける奴では普通に見えた???
このクラスの問題ではないか???
しかたがないのでソースを読むが分からんかった。
対症療法だが、GenerateText()メソッドの中の
coord->SetValue(.01, .01);
を
coord->SetValue(0.01, 0.05);
に変えて見えるようになった。
と思ったら、別のパネルに貼り付ける奴では普通に見えた???
このクラスの問題ではないか???
2009年7月14日火曜日
BOOST_PP_SEQ_ELEM_III error
これもしばらく苦しんだのでメモ
"BOOST_PP_SEQ_ELEM_III" requires 2 arguments, but only 1 given とでたら、
BOOST_PP_SEQ_ELEMを遅延評価に。
BOOST Archives参照
"BOOST_PP_SEQ_ELEM_III" requires 2 arguments, but only 1 given とでたら、
BOOST_PP_SEQ_ELEMを遅延評価に。
BOOST Archives参照
2009年7月13日月曜日
2009年7月11日土曜日
boost::preprocessor nested seq
しばらく苦しんだのでメモ。
boost::preprocessorで入れ子のコンテナ例えばシーケンスのシーケンスを処理するとき同じマクロを2度使えない。
#define SEQ ((Red)(Blue))((Blue)(Red))((Black)(White))((While)(Black))
を処理しようとすると、
○
#define INNER_MACRO(r, data, i, elem) BOOST_PP_CAT(elem, data)
#define OUTER_SEQ(r, data, elem) \
BOOST_PP_SEQ_FOR_EACH_I(INNER_MACRO, _, elem)
BOOST_PP_SEQ_FOR_EACH(OUTER_SEQ, _, SEQ)
×
#define INNER_MACRO(r, data, elem) BOOST_PP_CAT(elem, data)
#define OUTER_SEQ(r, data, elem) \
BOOST_PP_SEQ_FOR_EACH(INNER_MACRO, _, elem)
BOOST_PP_SEQ_FOR_EACH(OUTER_SEQ, _, SEQ)
VC++で確認するには
cl /EP/ /I c:\Boost\include\boost-1_39 .\test.h
おまじない
"C:\Program Files\Microsoft Visual Studio 8\VC\bin\vcvars32.bat"
も忘れないように。
追記:IDEからはプロジェクトのプロパティ->プリプロセッサ->前処理済みのファイル生成=>行番号なし、で確認できる。
boost::preprocessorで入れ子のコンテナ例えばシーケンスのシーケンスを処理するとき同じマクロを2度使えない。
#define SEQ ((Red)(Blue))((Blue)(Red))((Black)(White))((While)(Black))
を処理しようとすると、
○
#define INNER_MACRO(r, data, i, elem) BOOST_PP_CAT(elem, data)
#define OUTER_SEQ(r, data, elem) \
BOOST_PP_SEQ_FOR_EACH_I(INNER_MACRO, _, elem)
BOOST_PP_SEQ_FOR_EACH(OUTER_SEQ, _, SEQ)
×
#define INNER_MACRO(r, data, elem) BOOST_PP_CAT(elem, data)
#define OUTER_SEQ(r, data, elem) \
BOOST_PP_SEQ_FOR_EACH(INNER_MACRO, _, elem)
BOOST_PP_SEQ_FOR_EACH(OUTER_SEQ, _, SEQ)
VC++で確認するには
cl /EP/ /I c:\Boost\include\boost-1_39 .\test.h
おまじない
"C:\Program Files\Microsoft Visual Studio 8\VC\bin\vcvars32.bat"
も忘れないように。
追記:IDEからはプロジェクトのプロパティ->プリプロセッサ->前処理済みのファイル生成=>行番号なし、で確認できる。
2009年6月12日金曜日
vtkコンパイルエラー
新しく5.4.2が出たけれども相変わらずコンパイルエラーが出るのでメモ
tif_fax3sm.c: Cannot create output file.と出たら。
chmod +w ./VTK/Utilities/vtktiff/tif_fax3sm.c
http://www.vtk.org/Bug/view.php?id=7813
tif_fax3sm.c: Cannot create output file.と出たら。
chmod +w ./VTK/Utilities/vtktiff/tif_fax3sm.c
http://www.vtk.org/Bug/view.php?id=7813
2009年6月11日木曜日
マクロの設置場所 (pythonでOpenOffieをあやつる。)
pythonで作成したマクロは
$HOME./.openoffice.org/3/user/Scripts/の下にpythonを掘って入れよう。
$HOME./.openoffice.org/3/user/Scripts/の下にpythonを掘って入れよう。
pythonでOpenOffieをあやつる。
spreadsheetをCSVにしようとはじめたが嵌まった。なんぼやってもplane textで保存できなかった。
保存するときの引数を渡すときそれぞれがオブジェクトだということを忘れてました。
結局こう
saveProperty=[]
p=PropertyValue()
p.Name="FilterName"
p.Value="Text - txt - csv (StarCalc)"
saveProperty.append(p)
p=PropertyValue()
p.Name="FilterOptions"
p.Value="44,34,76,1"
saveProperty.append(p)
p=PropertyValue()
p.Name="SelectionOnly"
p.Value=True
saveProperty.append(p)
doc.storeToURL(unohelper.systemPathToFileUrl(fname), tuple(saveProperty))
ちなみにpythonでoooを操るときはそっけなくてあちこち行かなければならないAPIみるよりhttp://api.openoffice.org/docs/DevelopersGuide/DevelopersGuide.xhtmlのほうがましかも。
保存するときの引数を渡すときそれぞれがオブジェクトだということを忘れてました。
結局こう
saveProperty=[]
p=PropertyValue()
p.Name="FilterName"
p.Value="Text - txt - csv (StarCalc)"
saveProperty.append(p)
p=PropertyValue()
p.Name="FilterOptions"
p.Value="44,34,76,1"
saveProperty.append(p)
p=PropertyValue()
p.Name="SelectionOnly"
p.Value=True
saveProperty.append(p)
doc.storeToURL(unohelper.systemPathToFileUrl(fname), tuple(saveProperty))
ちなみにpythonでoooを操るときはそっけなくてあちこち行かなければならないAPIみるよりhttp://api.openoffice.org/docs/DevelopersGuide/DevelopersGuide.xhtmlのほうがましかも。
2009年6月8日月曜日
reportlabでバーコード
http://two.pairlist.net/pipermail/reportlab-users/2008-November/007685.html
を写経してPDFにバーコードに文字列付けてhumanReadableで出力しようとしたところ。
Traceback (most recent call last):
File "./barcode2.py", line 16, in
barcode.drawOn(pdf,50*mm,250*mm)
File "/usr/lib/python2.6/dist-packages/reportlab/platypus/flowables.py", line 105, in drawOn
self._drawOn(canvas)
File "/usr/lib/python2.6/dist-packages/reportlab/platypus/flowables.py", line 89, in _drawOn
self.draw()#this is the bit you overload
File "/usr/lib/python2.6/dist-packages/reportlab/graphics/barcode/common.py", line 219, in draw
self.drawHumanReadable()
File "/usr/lib/python2.6/dist-packages/reportlab/graphics/barcode/common.py", line 164, in drawHumanReadable
self.annotate(x+width/2.,-y,s,fontName,fontSize)
File "/usr/lib/python2.6/dist-packages/reportlab/graphics/barcode/common.py", line 176, in annotate
getattr(canv,func)(text,x,y)
File "/usr/lib/python2.6/dist-packages/reportlab/pdfgen/canvas.py", line 1287, in drawCentredString
width = self.stringWidth(text, self._fontname, self._fontsize)
File "/usr/lib/python2.6/dist-packages/reportlab/pdfgen/canvas.py", line 1392, in stringWidth
(fontSize,self._fontsize)[fontSize is None])
File "/build/buildd/python-reportlab-2.3/src/rl_addons/rl_accel/_rl_accel.c", line 1104, in stringWidthU
File "/build/buildd/python-reportlab-2.3/src/rl_addons/rl_accel/_rl_accel.c", line 1147, in _instanceStringWidthU
AttributeError: decode
とエラー。
調べてみるとcommon.pyの line 176
175: else: func = 'drawString'
176: getattr(canv,func)(text,x,y)
177: canv.restoreState()
でcanvas.pyのline 1283のdrawCentredStringを呼んでいるけれど、定義はこう
1283: def drawCentredString(self, x, y, text):
ということで
176: getattr(canv,func)(x, y, text)
でしょう。
追記:patchを投げておきました。trunkは変わっています。
を写経してPDFにバーコードに文字列付けてhumanReadableで出力しようとしたところ。
Traceback (most recent call last):
File "./barcode2.py", line 16, in
barcode.drawOn(pdf,50*mm,250*mm)
File "/usr/lib/python2.6/dist-packages/reportlab/platypus/flowables.py", line 105, in drawOn
self._drawOn(canvas)
File "/usr/lib/python2.6/dist-packages/reportlab/platypus/flowables.py", line 89, in _drawOn
self.draw()#this is the bit you overload
File "/usr/lib/python2.6/dist-packages/reportlab/graphics/barcode/common.py", line 219, in draw
self.drawHumanReadable()
File "/usr/lib/python2.6/dist-packages/reportlab/graphics/barcode/common.py", line 164, in drawHumanReadable
self.annotate(x+width/2.,-y,s,fontName,fontSize)
File "/usr/lib/python2.6/dist-packages/reportlab/graphics/barcode/common.py", line 176, in annotate
getattr(canv,func)(text,x,y)
File "/usr/lib/python2.6/dist-packages/reportlab/pdfgen/canvas.py", line 1287, in drawCentredString
width = self.stringWidth(text, self._fontname, self._fontsize)
File "/usr/lib/python2.6/dist-packages/reportlab/pdfgen/canvas.py", line 1392, in stringWidth
(fontSize,self._fontsize)[fontSize is None])
File "/build/buildd/python-reportlab-2.3/src/rl_addons/rl_accel/_rl_accel.c", line 1104, in stringWidthU
File "/build/buildd/python-reportlab-2.3/src/rl_addons/rl_accel/_rl_accel.c", line 1147, in _instanceStringWidthU
AttributeError: decode
とエラー。
調べてみるとcommon.pyの line 176
175: else: func = 'drawString'
176: getattr(canv,func)(text,x,y)
177: canv.restoreState()
でcanvas.pyのline 1283のdrawCentredStringを呼んでいるけれど、定義はこう
1283: def drawCentredString(self, x, y, text):
ということで
176: getattr(canv,func)(x, y, text)
でしょう。
追記:patchを投げておきました。trunkは変わっています。
登録:
投稿 (Atom)