【ハウツー】

CPython用拡張モジュールをIronPythonから呼び出す

1 「CPython Extensions for IronPython」とは?

    Wacky  [2008/02/08]

    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ライブラリを使った使用例をいくつか紹介しよう。

    関連したタグ

    新着記事

    特設サイトの情報

      人気記事

      一覧

      新着記事

      特別企画

      マイナビニュースマガジン