ソフトウェア」カテゴリーアーカイブ

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()

 

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

Windows で へろく ってみる。

image

こんなこと言われましたが僕はめげません。
どうもみむらです。

Heroku  Cloud Application Platform

Heroku がなかなかおもしろい環境の予感がしたので、早速導入。

 

0. Heroku のアカウントを作る。

https://api.heroku.com/signup
Heroku Signup

ここから heroku のアカウントを作る。

 

1.Ruby 環境導入

RubyForge Ruby Installer for Windows ファイルリスト

ここから最新版の rubyinstaller を落としてきてインストール。

image

image

 

2. git インストール

Git – Fast Version Control System

Windows ロゴクリックして、最新版をとってきてインストール。

 

3.heroku 準備

Heroku  Dev Center  Getting Started with Heroku
ここを参照しながら。

3.1 heroku に必要なものをどっちゃりいれる。

image

gem install heroku rack bundler sinatra shotgun

3.2.SSH Key 作る。

image

Git Bash を立ち上げる。

image

$ ssh-keygen -t rsa -C "[e-mail アドレス]"
Generating public/private rsa key pair.
Enter file in which to save the key ( [環境によってここは変わる]  ): [何も打たずに Enter]
Created directory '...'
Enter passphrase (empty for no passphrase) : [パスワードを入れて Enter]
Enter same passphrase again: [同じパスワードをいれて Enter]

image

終わったらウィンドウを閉じる。

 

3.3. git 準備

image

git init
git add .
git commit -m "[コミットメッセージ (任意の文字列) ]"

image

heroku create

Enter your Heroku credentials.
Email : [heroku のログインに使用するメールアドレス]
Password : [heroku のログインに使用するパスワード]

4.おつかれさまでした


って、これだけで適当に完了。

一応サンプルコードを書いてみたり。

HerokuでSinatraを使ってHello worldする – アインシュタインの電話番号☎

ということで、ここを参考にしてみる。

とりあえず、私の環境だと動いたのでこんなところで。

Windows 7 のタスクバーでもう一つ立ち上げる。

メモ代わりに。

image

こんな感じでタスクバーがありますが、たとえば IE をもう一つ起動したいとき。
このままアイコンをクリックしても今開いているウィンドウがアクティブになるだけです。

そんなときに、

Shift + クリック
or
マウスの中クリック

をすると、

image

もう一つ立ち上がりました。ひとまずメモまで。

Windows Developer Preview (Windows 8) を使ってみる。

みむらです。

12

Windows Metro Style Apps Developer Downloads
( http://msdn.microsoft.com/en-us/windows/apps/br229516 )

WIndows 8 の Windows Developer Preview が公開されました。

というわけで、使ってみた感想をば。

 

今回は、ノートPC (SONY VAIO VGN-SZ93NS) にインストールして実験しました。

CPU : Intel Core 2 Duo T7600 (2.33Ghz)
Mem : 4GB (SO-DIMM DDR2)
HDD : 256GB / 5400rpm

01
特徴的なのはこの Start Screen ですかね。
ログインするとこの画面に遷移します。 スタートボタンを押しても同様。

Windows Phone 7 に似てるね!

Start Screen 上のプログラムは、WinRT というAPI群で作成でき、
C / C++ / C# でも開発できますが、
HTML5 + Javascript でも開発可能です。Web 屋さんどうでしょう。

 

Metro UI 上のアプリケーションは全て最大化されて実行されます。

02

Internet Explorer を立ち上げた図。
もちろん、デスクトップから立ち上げた場合はこの画面ではないのですが、
Metro UI 上なので、最大化されて表示されます。

まさしく Windows Phone 7 のIE を引き延ばしたような感じ。

 

コントロールパネル:

08

 

Start Screen の中の「Desktop」をクリックすると、Windows のデスクトップを表示することが可能です。

04

スタートボタンを押すと、先ほどの Start Screen に遷移してしまうので、
もしかするとタスクバーによく使うアプリケーションを配置しておくといいのかもしれません。

05

画面左下にマウスを持って行きますと、このようなメニューが表示されます。
そこの Settings を選ぶと、

06

このように、サイドバーのようにメニューが表示されます。
シャットダウンや画面の明るさ、音量などは、この画面からさくっと変更できます。
(従来通り、通知領域から設定を変更することも可能です。)

そして、気になるのがエクスプローラのリボン表示。

11

リボンを表示させるとこのような状態になります。

コンピュータを初めて使う方には、こういうメニューで選べるのは有り難いですが、
操作に慣れている人は画面を広げたいと思うもの。

このリボンを最小化すると、
03

このようになります。個人的には、戻る、進む、上のフォルダへ行く、あとフォルダパスが表示されているので、
これでいいんじゃないかなと思ってみたり。 (現に Microsoft の Keynote では、最小化した状態でプレゼンしてました)

09

リボンはまぁ、言うまでもなく、こいつの影響をうけてますよね・・w

 

ファイルコピーや削除時のダイアログも変化しています。

17
コピー前に、処理時間の計算が無くなったからなのか、すぐにコピーが開始されます。

2つコピーするときはこんな感じ。

16

 

また、More details を押すと、以下のように豪華になります。

18

15

タスクマネージャーも変化しました。

13

通常表示はこの画面。直ぐさま消したいとか、変なところいじるのが怖いっていう人向けに、
こういう感じの簡素表示はいいと思います。

 

14

More Details を押すと、ここまで豪華になります。

 

ここまでみて、Windows 8 は結構操作しにくそうだなぁと思う人もいるかなと。
私は、新時代に突入するために一気に革新する必要があったのかなと思うのですが、
過去のインタフェースを使う人もいるはず。

そんな人向けに、

HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer
RPEnabled (REG_DWORD)

こいつを 0 にして再起動しますと、
23

こうなります。

27

タスクマネージャはこのように従来のデザインとなり、

24

エクスプローラは、上に移動を残して過去のデザインそのままになります。

 

Developer Preview ですので、今後どうなるか、大幅な変更も考えられるわけで
結構気になるところではありますが、今後に期待してみたいと思います。

 

P.S.

Unix と Windows の世界の融合 みたいなのをこの前話してきて、
SUA を使うっていう話をしてきましたが、

26

どうやら、WIndows 8 では消されてしまうようです。

代わりに Hyper-V が入っているので、まじめな軽量 UNIX でも動かしてがんばるのかなぁと予想してみたり。
今後に期待ですね。