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のような画面が見られるハズだ。
利用時の注意点
この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\」に以下のファイルが存在している必要がある。
- matplotlib(グラフ描画ライブラリ)
- Numerical Python(数値演算ライブラリ)
- 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()
要するに、Cpythonにおいて通常ライブラリを呼び出すために"import pylab"と記述するところを、"pylab = Import('pylab')"という風に書き換えるのだ(また、元のCPythonのライブラリの場所を教えるためのおまじないが少々必要)。
では、どうやって、こんなことを実現しているのだろうか?
実は、Pythonのフックメソッド機構を使って、呼び出したいCPythonのライブラリを包装紙のように包んで、Python.Runtime.dllに処理を依頼しているのである(技術的には、デコレータや委譲と呼ばれる仕掛けである)。イメージ図に表すと図1のようになる。
図1: 「CPython Extensions for IronPython」の動作イメージ |
こんなことが実現可能なのも、Python言語の柔軟性ゆえであろう。
以降では、cextライブラリを使った使用例をいくつか紹介しよう。