SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

C#とIronPythonで変化に強いWindowsアプリケーションを作る

C#から動的言語であるIronPythonを実行する

  • X ポスト
  • このエントリーをはてなブックマークに追加

最初の簡単なプログラム

 それでは、ボタンとフォームの文字を変えるだけの簡単なプログラムから見ていきましょう。

実行前
実行前
実行後(ボタンとタイトルの文字が変わる)
実行後(ボタンとタイトルの文字が変わる)

C#のコードの書き方

 C#のコードは次のようになります。

Form1.cs
using IronPython.Hosting;

private void btnSimple_Click(object sender, EventArgs e)
{
    PythonEngine pe = new PythonEngine();
    pe.Globals.Add("MyButton", this.btnSimple);
    pe.ExecuteFile(@".\..\..\1st.py");
}

 1行ずつ見ていきましょう。

PythonEngineクラスをインスタンス化する

PythonEngine pe = new PythonEngine();

 C#からIronPythonを呼び出すためには、PythonEngineクラスをインスタンス化する必要があります。IronPython.Hosting名前空間に存在するPythonEngineクラスは、IronPythonを実行する本体そのものです。

共有する変数をGlobalsプロパティに登録する

pe.Globals.Add("MyButton", this.btnSimple);

 次にIronPython側と共有する変数をPythonEngineクラスのGlobalsプロパティ(IDictionary<string,object>型)に登録します。Globalsプロパティには文字列(IronPython変数)とオブジェクト(C#変数)のペアを登録します。ここではGlobals.Add("MyButton", this.btnSimple)というように、MyButtonという名前でクリックされたボタンbtnSimpleを登録しています。

ExecuteFileメソッドでPythonスクリプトを実行する

pe.ExecuteFile(@".\..\..\1st.py");

 最後に、PythonEngineクラスのExecuteFileメソッドを呼び出して、Pythonのスクリプトファイルを読み込み、実行しています。ここでは、実行ファイル(exeファイル)の2つ上の階層にある「1st.py」ファイルを読み込んで実行しています(本稿ではVisualStudioからすぐに編集できるように、Pythonスクリプトをこの場所に配置していますが、実際のアプリケーションでは、実行ファイルと同じフォルダかサブフォルダに配置することが多いでしょう)。

Pythonスクリプトの書き方

 続いて、Pythonスクリプト「1st.py」の中身を見てみましょう。

1st.py
# coding: utf-8
#最初の例(MyButtonをGlobalで共有)
MyButton.Text = "スクリプトを実行しました"
MyButton.Parent.Text = "IronPythonが動きました"

 IronPython側のコードはこの4行です。

エンコード名の指定

 1行目ではファイルのエンコード形式を指定しています。

ファイルのコーディング形式の指定方法
# coding: エンコード名    

 コーディング名としては、「utf-8」のほか「shift-jis」「euc-jp」などが指定できます。IronPythonの内部で管理している文字コードはUnicodeですし、Visual Studioからテキストファイルを作る場合はデフォルトでUtf-8になりますので、最初のうちは# coding: utf-8と指定しておけば問題ないでしょう。

コメントの記述

 Pythonでは、#の右から行末までは、コメントとみなされます。そのため、2行目はコメントとして扱われます。なお、先ほどの1行目もコメントですが、codingという文言などを判定して特別にエンコード指定として認識されています。

Globalsプロパティに登録した変数の使用

 Pythonでは、左辺の変数に対して、「=(イコール)記号」を使って右辺に値を代入できます。例えば、x = 1の場合、xという変数に数字の1を代入します。

1st.pyの3~4行目
MyButton.Text = "スクリプトを実行しました"
MyButton.Parent.Text = "IronPythonが動きました"

 ここでは、MyButtonという変数に文字列を代入しています。このMyButtonは、C#のbtnSimpleオブジェクトを表します。C#側でGlobalsプロパティで設定されたオブジェクトは、Pythonスクリプトで自由に参照・変更できます。ここではTextプロパティを変更してボタンの表示を変更しています)。

 4行目でも同様に、MyButtonオブジェクトのParentプロパティ(つまりForm1オブジェクト)のTextプロパティを操作して、フォームのタイトルを変更しています。

最初の例の完成

 以上でボタンとフォームの表示を変えるプログラムは完成です。IronPythonで面白いところは、アプリケーションを再起動しなくてもスクリプトの内容を変えればその結果が反映されることです。時間があればぜひスクリプトをいじってみてください。

外部ファイルの取り扱い時の文字コード
 IronPythonのデフォルトエンコーディング(Unicodeを処理するデフォルトのエンコーディング指定)は「ASCII」となっています。そのためファイルに書き出すときなどには文字化けが起こる可能性があります。その際には、C#側でデフォルトエンコーディングを変更して文字化けを回避することができます。
デフォルトエンコーディングの変更
PythonEngine pe = new PythonEngine();
pe.Sys.DefaultEncoding = Encoding.UTF8; //デフォルトエンコードの変更

次のページ
Python側で宣言した変数の値を取得する

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
特集記事連載記事一覧

もっと読む

この記事の著者

百賀 吟平(モモガ ギンペイ)

主に.NETを使ったアプリケーション開発に従事するプログラマー。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/2187 2008/02/25 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング