IronPythonは、いわゆるCPythonと高い互換性を持っており、過去のCPythonの資産と.NET Frameworkの資産を両方から扱うことのできる、"糊"(glue)言語の一面を持っている。

しかし、全ての資産を扱えるわけではなく、例えばCPythonの資産で利用可能なのは、スクリプトのみで作成されたライブラリ(拡張子が.py)である。C言語で作成された拡張モジュールと呼ばれるライブラリ(拡張子が.pyd)は使用できない。

ところが先ごろユーザーコミュニティより、IronPythonからこれら拡張モジュールを扱えるライブラリが発表された。本稿では、この「CPython Extensions for IronPython」と呼ばれるライブラリの紹介と簡単な利用方法について、説明を行う。

CPython、IronPythonとライブラリの関係

CPython IronPython
スクリプトで作成されたライブラリ(.py)
拡張モジュールで作成されたライブラリ(.pyd) △(今回解説する)
.NET Frameworkで作成されたライブラリ(.dll) ×

まずは動かしてみよう

「CPython Extensions for IronPython」(以降、cextライブラリと呼ぶ)は、Resolver Systemsが始めたプロジェクトの一部である。このライブラリで何ができるかは、まずサンプルを見た方が手っ取り早い。

CPython Extensions for IronPython」の「Download」から配布ファイル(cext-ironpy-0.1.4.zip、2月8日現在)をまずダウンロードしてほしい。

次に、配布ファイルの展開後、同梱されているtest.pyを実行してみよう。うまく動けば、画面1のような画面が見られるハズだ。

画面1: test.py実行結果

利用時の注意点

このcextライブラリを動かすには、IronPython 2.0A2(2月8日現在、最新版は2.0A8)以上が必要である。IronPython 1.0/1.1では動作しない点に注意されたい。

また、Python 2.4.xの導入が必須となっている(編集部ではPython 2.4.4を導入した環境で検証した)。さらに、CPython(Python 2.4.4)側に以下のライブラリの追加インストールが必要である。
このほかmatplotlib用に、「C:\windows\system32\」に以下のファイルが存在している必要がある。
  • msvcp71.dll

画面1のグラフは、matplotlibで配布されているグラフ描画ライブラリで出力したものだ。このライブラリは、拡張モジュール(.pyd)が含まれており、通常ではIronPythonから呼び出せないのだが、cextライブラリを介することで呼び出し可能となっている。

ライブラリの使用方法と種明かし

cextライブラリを使用するには、カレントフォルダに以下のファイルを配置しておき、後述する書式に従って、コードの一部を変更すれば良い。

  • embedding.py
  • cext.py
  • Python.Runtime.dll

たとえば、以下のCPython向けのコードがあるとしよう。

import pylab
pylab.plot([1, 1, 1.5, 2.5, 3, 3, 3.1])
pylab.show()

これをcextライブラリを使って書き換えると、以下のようになる(画面2)。

from embedding import Import
sys = Import('sys')
sys.path.append('C:\\Python24\\Lib')
sys.path.append('C:\\Python24\\Lib\\site-packages')
pylab = Import('pylab')

#import pylab
pylab.plot([1, 1, 1.5, 2.5, 3, 3, 3.1])
pylab.show()

画面2: cextライブラリを利用しCPythonコードを書き換え、実行した結果

要するに、Cpythonにおいて通常ライブラリを呼び出すために"import pylab"と記述するところを、"pylab = Import('pylab')"という風に書き換えるのだ(また、元のCPythonのライブラリの場所を教えるためのおまじないが少々必要)。

では、どうやって、こんなことを実現しているのだろうか?

実は、Pythonのフックメソッド機構を使って、呼び出したいCPythonのライブラリを包装紙のように包んで、Python.Runtime.dllに処理を依頼しているのである(技術的には、デコレータや委譲と呼ばれる仕掛けである)。イメージ図に表すと図1のようになる。

図1: 「CPython Extensions for IronPython」の動作イメージ

こんなことが実現可能なのも、Python言語の柔軟性ゆえであろう。

以降では、cextライブラリを使った使用例をいくつか紹介しよう。