Python」カテゴリーアーカイブ

IronPython を C# から使ってみる。

みむらです。

Python でさくさくっとコードを書いて実験するという人はいると思うのですが、
それを .net で応用してみようという感じの内容です。

今回は執筆時のバージョン IronPython 2.7.1 を用いて紹介します。

(本家 Python の Version 2.7.1 と多少の点は異なりますが、かなりの部分で互換性があります。)

 

1.環境準備

C# の開発環境として、今回は Visual Studio 2010 を使用します。

http://www.microsoft.com/japan/msdn/vstudio/express/
ない方は、こちらから express 版を入れておくと良いかと思います。

 

加えて、今回のメインである、IronPython を、
http://www.ironpython.net/
ここから、ダウンロードしてインストールします。

 

2.プロジェクト作成

Visual Studio を立ち上げて、プロジェクトを作成します。

image

image

Visual C# の 「コンソールアプリケーション」を作成。

 

3.参照に IronPython を追加する。

image

ソリューションエクスプローラの参照設定を右クリック –> 参照の追加

image

インストールディレクトリに移動して、

C:\Program Files\IronPython 2.7.1
or
C:\Program Files (x86)\IronPython 2.7.1

あたりにファイルがいると思います。

IronPython.dll と Microsoft.Scripting.dll を追加。

 

4.コードを書く

コードの先頭に

using IronPython.Hosting;
using Microsoft.Scripting.Hosting;

を追記。

最小のコードとしてはこんな所でしょうか:

using IronPython.Hosting;
using Microsoft.Scripting.Hosting;

class Program
{
    static void Main(string[] args)
    {
        ScriptEngine engine = Python.CreateEngine();
        ScriptSource src = engine.CreateScriptSourceFromString("print \"Hello Python World\"");
        src.Execute();
    }
}

5.実行

image

 

ということで、ばっちり Python コードが C# 上から実行可能です。


応用例をいくつか。

ScriptScope を定義することによって、C# 上のクラスや、他のオブジェクトを触ることも可能となります。

using System;
using IronPython.Hosting;
using Microsoft.Scripting.Hosting;

public class hoge
{
    public void call()
    {
        System.Console.WriteLine("Hello C# World");
    }
}

class Program
{
    static void Main(string[] args)
    {
        ScriptEngine engine = Python.CreateEngine();
        ScriptScope scope = engine.CreateScope();
        scope.SetVariable("hoge", new hoge());

        ScriptSource src = engine.CreateScriptSourceFromString(@"

print ""Hello Python World""
hoge.call()"
        
            );
        src.Execute(scope);
    }
}

実行結果:

image

 

上記のように、

CreateScope() メソッドで作成したスコープに対して、

SetVariable() メソッドを利用し、第1引数に名前、第2引数に実体を指定することにより、

Python 上から利用可能となります。

 

ただ一つ注意点としては、

クラスが public でないと正常に動作しないという点があります。

 

これは、個人的には Python のクラスが全て public なのが起因しているのかと予想しておりますが、

詳細はよく分かっていません。


別の例:

image

using System;
using IronPython.Hosting;
using Microsoft.Scripting.Hosting;

class Program
{
    static void Main(string[] args)
    {
        ScriptEngine engine = Python.CreateEngine();

        ScriptSource src = engine.CreateScriptSourceFromString("1+2+3");
        System.Console.WriteLine("RET : " + src.Execute());
    }
}

Execute メソッドの戻り値はそのまま実行結果になっていますので、

このように結果を C# 側に返すということも可能です。

 

また、

image

このように、GetVariable メソッドを利用して値を取得することも可能です。


 

IronPython の利用例としては、

プログラム上のマクロ機能の提供が一番大きいのではと考えております。

その他には、Python でライブラリが提供されている物に対して、IronPython を通して C# から利用するというパターン。

 

今回の IronPython と同様のコールの仕方を用いることで、

http://ironruby.net/

こちらの IronRuby を利用することも可能です。

執筆時点では Version 1.1.3 ですが、これは本家の Ruby の Version 1.9.2 と互換性があると明記されています。

 

.net では同じ .net 上で動作する言語同士を協調動作させることができますので、

こういうのもアイデアによっては非常に良い物になるのではないでしょうか。

 

最後に。私が某所でやってきた時のプレゼン資料を最後に貼り付けておきます。

はろーふらすこ、はろーしなとら。

どうもみむらです。

ウェブ系のフレームワークは実は難しいんでしょ! と疑っていたのですが、
実際使ってみたら拍子抜けするレベルに簡単だったのでそのメモ。

意気込みを返せ-! っていう感じではありますが、
それだけ入りやすくて、本当に作りたい部分に集中出来るってことで良いんだと思います。

1.Ruby + Sinatra で Hello World

gem で sinatra を入れる。

下記のコード書く。

require 'sinatra'

get '/' do
   'Hello world!'
end

 

2.Python + Flask で Hello World

easy_install で Flask を入れる。

下記のコード書く。

from flask import Flask
app = Flask(__name__)

@app.route('/')
def func():
    return "Hello world!"

if __name__ == '__main__':
    app.run()

 

ということで、ひょえー。です。

Python + pywin32 で COM 叩いてしゃべらせる。

どうもみむらです。
普段は SUA (UNIX 互換環境) 上で叩いているのですが、
今日は堂々と Windows 上で叩いてみます。

PyWin32 ってのをつかって、 COM コントロールを叩いてみます。

とりあえず。COM コントロールとは。

Microsoft社が提唱する、部品化されたプログラムを作成・利用するための基盤となる技術仕様。特定の機能のみを持つプログラム部品を組み合わせることでアプリケーションソフトの開発が容易になる。この仕様に基づいてデータのやりとりができるプログラム部品のことをCOMコンポーネントと呼ぶ。

COMとは【Component Object Model】 – 意味-解説-説明-定義 : IT用語辞典

だそーです! (ぉ

夢のある話をすると、COM コントロールを使うことで、
音声認識や音声合成、各種 Office アプリケーションの制御、その他 COM コンポーネントが提供する機能を
使うことが出来ます。


1.Python の導入

http://www.python.jp/Zope/download/pythoncore
上記URL から、 Python 2.x 系をインストールします。

えーと、Python 3.x 系はいろいろと変わったようで。でも動くのかなぁ。うーん

2.Python for Windows extensions の導入

http://sourceforge.net/projects/pywin32/files/pywin32/
ここから最新ビルド(一覧の 「Build???」 の数字が一番大きい物を選択)のうちの、
上で導入したバージョンと同じ物(無ければ近いバージョン)をインストール。

3.叩く。

ばんばん! ちがいます。
スタートメニューから Python を立ち上げて、

image

このように立ち上げておきます。

続けて、

import win32com.client

とタイプ。

image

今回は音声合成ということで、「Sapi.SpVoice」を使って、

Speak メソッドを叩いてしゃべらせます。

もし今回使う、「Microsoft Speech API」が気になる人は、

http://msdn.microsoft.com/en-us/library/ms723602(v=VS.85).aspx

この辺の資料を参考にして下さい。

speech = win32com.client.Dispatch("Sapi.SpVoice")
speech.Speak("Hello Python World!")

実行しますと、Win7 / Vista 環境では、多分、米国英語のおねいさんが

しゃべってくれると思います。

XP 環境ですと、なんか相当声のしゃくれたおっちゃんがしゃべってくれた気がします。

・・試してないですが。

とりあえずこんな感じでー。