今回の方法でインストールすると、site-package下にhogehoge.pyと_hogehoge.soが配置される。hogehogeというdirectoryを掘ってその下に入れてほしい場合はまた考える必要がありそうだが、Extensionがfileを生成すると思っていれば多分ただしくsetup.pyをかけるだろう。
hogehoge.cをhogehoge.iを書いて, site-packageからimport hogehogeできるようにするには次のようにする。
MANIFEST
hogehoge.c
hogehoge.i
hogehgoe.h
setup.py
setup.py
from distutils.core import setup, Extension
setup(
name='hogehoge',
version='0.1',
description='hogehoge module',
ext_modules=[
Extension(
'_hogehoge',
[
'hogehoge.i',
'hogehoge.c',
],
),
],
py_modules=['hogehgoe'],
)
解説:
MANIFEST
buildに必要なファイルは全部書きます。
ここにhogehoge.pyが入っていないことに注意(SWIGが生成するから)。
setup.py
setupの引数のname='hogehoge'だが、import hogehogeしたいのだから必然
Extension の第一引数のnameが'_hogehoge'になっているのに注意。SWIGは.soの名前が_XXX.soになることを期待しているので、こうしなければならない。
第2引数はソースリストだが、これはSWIGに渡すものとgccに渡すファイルを指定する。こうすると勝手にSWIGを呼び出してhogehoge_wrap.cとhogehoge.pyを生成し、次にgccを呼び出してhogehoge.cとhogehoge_wrap.cをコンパイルし、リンカを呼び出してそれらの.oから_hogehoge.soを生成してくれる。ここで注意しなければならないのは.cを指定し忘れてもpackgaeが生成でき、.soがインストールされてしまうということだ。もちろん.c内で定義されているものを呼び出すことはできないのでimport先でexceptionを起こして止まってしまう。
最後にsetup.pyのpy_modulesで、hogehoge.pyを指定しているが、これによりSWIGの生成したhogehgoe.pyがsite-package下にコピーされます。これがないとhogehoge.pyがコピーされません。setupの途中、手元にないpyを指定するのでエラーが出ますが続行されます。最終的にはSWIGが生成したpyがコピーされるので問題はないですが。
5 件のコメント:
うが。
error: Installed (but unpackaged) file(s) found:
/usr/lib64/python2.4/site-packages/FIBSCookieMonster.pyo
buildbotではsetup.cfgに
[install]
optimize=1
としてやっても、pyが生成される前なのでエラーになってしまう。
.pydistutils.cfgを用意しないと駄目?しかもこれをリモート環境に要求するんだよね、当たり前なんだけど。
ヤレヤレ。
うは・・・
/var/tmp/FIBSCookieMonster/
に残骸が残っていて消せない。
とりあえずsudoして消して実験したら読みどおり。う~~む。どんどんbad know howな方向に進んでいてやだなぁ。
てか、/var/tmpの下もuser名でdir掘って使ってほしい・・・。
buildbot-slaveと開発マシンが同じなのでこれは対処したほうがよさそう。
体に悪い。
.pydistutils.cfg
を用意したらうまくいった。なんだかなぁ。
コメントを投稿