傀儡師の館.Python

傀儡師の館.Python

PR

×

Calendar

Keyword Search

▼キーワード検索

Archives

2026.07
2026.06
2026.05
2026.04
2026.03
2026.02
2026.01
2025.12
2025.11
2025.10

Profile

kugutsushi

kugutsushi

Free Space

設定されていません。
2003.11.29
XML
カテゴリ: ことばの処理
日本語係り受け解析器 CaboCha/南瓜: Yet Another Japanese Dependency Structure Analyzer を Python から使うのに, ctype から使えるようにしてみようかと思って,まずは,ctype の方を見てみることにした。ctypes に関しては,奈良先端科学技術大学院大学 情報科学研究科 21 世紀 COE 研究員の Yasushi Masuda さんが 日本語訳されている ので,これを参考にさせてもらうことにする。ん,この方も,奈良先端科学技術大学院大学。MeCab や CaboCha の くどう たく さんも奈良先端科学技術大学院大学。

こういう先端科学技術大学院大学構想ってのは,誰が作ったのかは知らないが, 奈良先端科学技術大学院大学 は成功なんだろうな。Nature や Science にも,バイオサイエンス系で論文が掲載されているみたいだし。でも,バイオはぜんぜん分からんので読む気にもならない。その他, NAIST 産学連携提案テーマベース なんていうページもある。眺めてみると,おもしろいかな。



要するに Python から C のライブラリを呼び出すためにつかうもので,特に Python 用に書かれたモジュールじゃなくても,Python から呼び出せるようにしてしまうものと考えればいいだろう。同じようなものとしては,calldll というのがあったけれど,アップデートももう行われていないようだし,ctypes の方がよさそうなので,ctypes を使うことにする。COM フレームワークにも対応したので,Windows で使うには便利に使えそうだし,それだけでなく Linux や MacOSX でも動くというところもよいかな。

でもって,まず Source forge から ctypes をダウンロード してくる。私は Python は 2.3 を使っているのでctypes-0.6.2a.win32-py2.3.exe をダウンロードしてきた。ダウンロードしてきた実行ファイルをダブルクリックするとインストーラが起動するので,簡単にインストールできた。

で,次に チュートリアル をやってみる。とりあえず,Linux のところは飛ばしてしまう。けど,これもしかして Linux で使っても便利なのかもしれないと記憶にとどめておくことにする。「ctypes では,多くのプリミティブな C 互換データ型を定義しています 」ということで,pure Python だと,あまり型を気にしなくていいけど,さすがに C のライブラリを呼び出すときには,型を意識しないとだめなのだな。ctypes の型は,c_char,c_byte, c_ubyte, c_short, c_ushort, c_int, c_uint, c_logn, c_ulong, c_longlong, c_ulonglong, c_char_p, c_wchar_p, c_void_p とあって,C の型に対応するような感じになっている。で,たとえば符号なしの整数(c_uint)に -3 を与えると,値が範囲外ということでエラーになると。



  >>> c_uint(-3)
  Traceback (most recent call last):
   File "<stdin>", line 1, in ?
  ValueError: Value out of range



あとは,可変のメモリブロックが必要な場合には,c_buffer があるのだな。で,実際に C のライブラリを呼び出してみると,次の例のようなのがあって,Python 整数型,文字列型,unicode 文字列型は明示的に指定しなくてもよいが,それ以外だと,いちいち値を渡すときに型を指定してあげないといけないと。まあ,ちと面倒。タイプレスのプログラミングばかりしていると,こういうのがめんどくさく感じる。堕落してしまうのだ(笑)。



  >>> printf("%f bottles of beer\n", 42.5)
  これはエラーになる。
  >>> printf("%f bottles of beer\n", c_double(42.5))
  42.500000 bottles of beer
  これはOK。

  >>> printf.argtypes = [c_char_p, c_double]
  >>> printf("%f\n", 13.5)
  13.500000
  10
  というように,あらかじめ引数の型を指定しておくこともできるのだな。なるほど



傀儡師の実験室, Windows 版の time.time() は精度が悪い で出てきた,GetTickCount なんかも,windll.kernel32.GetTickCount() とかすれば使えてしまうのだな。 便利便利。

日本語訳の「不完全型」のところに「XXX ここに書かれた昨日は完全にはうまく動作しないようです XXX」と typo があった。「昨日」は「機能」だな。あと,「table = FrozenTable.in_dll(pdll, "PyImport_FrozenModules")」の「pdll」は「pydll」だと思う。「for item in table:」の例のところは改行が入っていないので,見難くなっている。って,本人にメールでも出してフィードバックしてあげればいいのだけど,私は匿名だからなぁ...。

で,試しながら一通り読み通す。最後の例とかは,なぜかエラーが出て,同じようにならない(原文をチェックしてみた同じになっている。若干,動きが変わったのかな)。_fields_ = ("x", "i"), ("y", "i")のところを,_fields_ = ("x", c_int), ("y", c_int) としたら同じような動きになった。がまあいいや。

でもって,だいたいイメージが分かったので,あとは,実際に使ってみながら試してみることにする。

あとは, 傀儡師の実験室の「CaboCha を ctypes で使ってみようとしたが玉砕」

あと,1ページを15個の記事になるように設定してあったのだが,ページぐりがついていなかったので,15個を超えると,超えた分については,まったく表示されなくなってしまう。とりあえず,最初の5個だけ表示してあとは,タイトルのみにしてしのいでおこう。これに加えて TinyBlog は保存されているときに Title と body の区別がないので,タイトルを切り出そうとすると最初の行をとってくることになる。実に単純なプログラムなので,まともなものにしようとしたら,ほんとに全部書き直しだなぁ。






お気に入りの記事を「いいね!」で応援しよう

Last updated  2006.09.09 20:11:43
コメント(0) | コメントを書く


【毎日開催】
15記事にいいね!で1ポイント
10秒滞在
いいね! -- / --
おめでとうございます!
ミッションを達成しました。
※「ポイントを獲得する」ボタンを押すと広告が表示されます。
x
X

© Rakuten Group, Inc.
X
Design a Mobile Website
スマートフォン版を閲覧 | PC版を閲覧
Share by: