.NETでPythonのホスティング

デスクトップマスコットである「Apricot」で、タイマーやランチャーをサポートする方法を模索してる中、.NET環境上でPythonホスティングする方法を見つけたのでちょっと使ってみました。

ちなみにタイマーやランチャーなどの機能は外部のスクリプトに任せちゃおうかなと考えています。

早速、Pythonホスティングを行う方法ですが、「IronPython」(http://www.codeplex.com/IronPython)のIronPython.dllをリファレンスに追加して、以下のようにPythonEngineクラスを使ってExecuteまたはExecuteFileを呼び出すことによりPythonのコードを走らせることが出来ます。

更に、.NETのクラスをPythonEngineクラスのGlobalsプロパティにセットすると、Pythonのコード内で使用できるます。こいつはすごく便利で良いです。エクセレント!

例として、C#で書いてあるクラス「Calc」を用いてPythonのコード内で「1+2」の足し算をするものを作ってみました。
Pythonのコードは「test.py」という外部のファイルを使い、結果の表示はC#内で受取り表示します。

using System;
using System.Collections.Generic;
using IronPython.Hosting;
using IronPython.Compiler;

namespace Test
{
    public class Calc
    {
        public int Add(int a, int b)
        {
            return a + b;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Calc calc = new Calc();
            PythonEngine engine = new PythonEngine();

            engine.Globals["calc"] = calc;
            engine.ExecuteFile("test.py");

            int result = engine.EvaluateAs<int>("result");

            Console.WriteLine(result);
        }
    }
}
# test.py

def add(a, b):
	return calc.Add(a, b)

result = add(1, 2)

尚、このコードは1.1.1用です。将来のバージョンである2.0は、DLR (Dynamnic Language Runtime)上に構築されているようです。
このDLRを使うことによりホスティングする側は、Pythonを含めRubyなど複数のスクリプト言語ホスティングも簡単になるようです。


参考:

IronPython
http://www.codeplex.com/IronPython

荒井省三のBlog : [DLR] DLRを使った言語のホスティング
http://blogs.msdn.com/shozoa/archive/2008/01/09/dlr.aspx