SHOEISHA iD

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

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

特集記事

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

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

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

応用例(RSSの取得)

 最後の例として、Web上の情報にアクセスしてみましょう。コードの細かい解説は行いませんが、全体の流れを参考にしてください。

 CodeZineではRSS形式にて最新の記事情報を配信しているので、それを読み込んで表示させてみます。

RSSの取得(Form1.cs)
private void btnRss_Click(object sender, EventArgs e)
{
    //リストに設定するデータテーブルを作成
    DataTable table = new DataTable();
    DataColumn colTitle = new DataColumn("title",typeof(string));
    DataColumn colUrl = new DataColumn("url", typeof(string));
    DataColumn colDesc = new DataColumn("desc", typeof(string));
    table.Columns.AddRange(
       new DataColumn[] { colTitle, colUrl, colDesc });

    //「4th.py」という名前のスクリプトファイルを実行
    PythonEngine pe = new PythonEngine();
    pe.Globals.Add("table", table);
    try
    {
        pe.ExecuteFile(@".\..\..\4th.py");
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message, "エラー");
    }

    //スクリプトで設定されたデータテーブルをデータソースにセット
    this.lstRss.DataSource = table;
    this.lstRss.ValueMember = "url";
    this.lstRss.DisplayMember = "title";
}

 スクリプトを実行するところはこれまでと同じですが、データを受け渡すためにADO.NETのDataTableクラスを宣言し、「タイトル」「URL」「説明」を格納する列を追加しています。このオブジェクトをPythonと共有するために、Globalsプロパティにtableという名前で登録しています。

 また、ExecutFileメソッドを実行する部分をtry~catch句でくくっています。これによって、Python側でエラーがあったとしてもエラーをキャッチできます(IronPython独自のエラーは、IronPython.Runtime.Exceptions名前空間にて定義されています。詳細の処理を振り分けたい場合にはこれらのエラーを個別に制御することで処理を振り分けられるでしょう)。

 続けて、RSSを取得してデータテーブルにセットするPythonスクリプトを見てみましょう。

4th.py
#.NET Frameworkのクラスライブラリを使う宣言
import clr

#XML関連の参照設定とインポート
clr.AddReference("System.Xml")
from System.Xml import *

#RSSを取得
doc = XmlDocument()
doc.Load("http://codezine.jp/rss/new/20/index.xml")

#データ関連の参照設定とインポート
clr.AddReference("System.Data")
from System.Data import *

#XMLを解析してデータテーブルへ保存(ループ)
items = doc.SelectNodes("/rss/channel/item")
for item in items:
    row = table.NewRow()
    row["title"] = item.SelectSingleNode("title").InnerText
    row["url"] = item.SelectSingleNode("link").InnerText
    row["desc"] = item.SelectSingleNode("description").InnerText
    table.Rows.Add(row)
(参考)RSSから取得されたXMLのレイアウト
<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"> 
  <channel> 
    <item> 
      <title>記事のタイトル</title>  
      <link>記事へのリンクURL</link>  
      <description>記事の説明</description>  
      <category>カテゴリ</category>  
      <pubDate>日付</pubDate> 
    </item>  
    <item> 
    記事の繰り返し
    </item> 
  </channel> 
</rss>

 このPythonスクリプトでは、.NET FrameworkのSystem.Xml名前空間のクラスを使って、RSSを取得しています。そして、そのRSSを解析して、DataTableオブジェクトであるtable変数に値を設定しています。

 実行結果は次のようになります。

実行後
実行後

 IronPythonを利用して、RSSデータの取得ができました。今後もし、RSSを配信するURLが変更になったりレイアウトが変更になったとしても、このPythonスクリプトを変更すれば再コンパイルする必要はありません。

Pythonでのインデントの意味
 最後のPythonスクリプトではforを用いたループを行っています。C#では、for文で繰り返す範囲を示すために中かっこ{ }を使いますが、Pythonではこのようなブロックの終了を示す記号はありません。その代わり、Pythonでは行頭からの空白(インデント)を元に処理する範囲を判断します。
 条件文であるIF文を例に紹介します。
C#でのIF文の例
int i = 1;
if (i == 1)
{
    Console.WriteLine("一致");
}
Console.WriteLine("終了");
PythonでのIF文の例
i = 1
if i == 1:
    print "一致"

print "終了"
 if文、関数宣言、クラス宣言といった定義でも、インデントの数によってブロックの範囲を制御しています。このインデントを用いたブロック判定はPython言語の特徴でもありますので、ぜひ覚えておいてください。

プログラムのまとめ

 最後にプログラムを作成する流れを整理します。

  1. IronPython.dllとIronMath.dllに参照設定する
  2. PythonEngineクラスをインスタンス化する
  3. C#と共有したい変数があればGlobalsプロパティに設定する
  4. Pythonスクリプトを記述する
  5. ExecuteFileメソッドを呼び出してPythonスクリプトを実行する
  6. Pythonスクリプトで取得したい変数があればEvaluateAsメソッドで読み込む

 以上で、C#とIronPythonの連携についての紹介はおしまいです。

IronPythonを学ぶには

 ここまでの解説を読んで、もっとIronPythonを使ってみたいと思った方は、IronPythonの配布サイトから、「IronPython-x.x.x(バージョン)-Bin.zip」をダウンロードして適当なフォルダに展開してください。そして、その中に含まれるインタラクティブシェル「ipy.exe」を実行してみると良いでしょう

インタラクティブシェルを起動しているところ
インタラクティブシェルを起動しているところ

 このインタラクティブシェルを使えば、IronPythonのスクリプトを簡単に試すことができます。構文が間違っていたりした場合には、その場でエラーが表示されるので、IronPythonを理解するには必須のツールと言えるでしょう。

IronPythonでインテリセンス

 また、Visual Studio SDK(2005 SDK4)をインストールすることで、Pythonファイルにインテリセンスをきかせたり、IronPythonだけでさまざまなアプリケーションを開発することも可能になります。詳細については、参考資料の@ITの記事をご覧ください。

IronPythonのライセンス

 IronPythonは限りなくオープンソースに近いライセンスにて公開されています。詳細はLicense.htmlに書かれていますが「Microsoft Public License (Ms-PL)」というライセンスで、商用でも非商用でも使用可能で、作成したソフトウェアと共に配布することも可能と書かれています。

IronPythonのソースコード

 実はIronPythonはC#によって実装されています。そのため、IronPythonのソースコードを読むこともできます。C#という言語をつかって、どのように別の言語を構築しているのを見ることもできます。

まとめ

 以上、駆け足でしたが、WindowsアプリケーションとIronPythonとの連携について紹介してきました。CPythonはもともと、デスクトップアプリケーション、Webアプリケーション、複数言語の部品をくっつける糊言語など、さまざまな目的で利用されてきています。IronPythonも同様に、.NET環境において、さまざまな目的で活用できるのではないでしょうか。

 また、執筆時点でのIronPythonの最新バージョンは1.1.1ですが、近いうちにバージョン2.0が公開される予定です。このバージョンでは、動的言語用の共通ライブラリ(DRL)を利用しています。そして、このDLRを利用するIronRuby、Managed Jscriptといった新しい動的言語も続々登場する予定です。これから大きく発展していく.NETの動的言語環境に乗り遅れないように今のうちにIronPythonを使い始めてみてはいかがでしょうか。

参考資料

  1. IronPythonの世界』(荒井 省三 著、ソフトバンク クリエイティブ、2007年3月)
  2. マイコミジャーナル:『【ハウツー】IronPythonを飼いならす - IronPythonの紹介とバージョン1.1の特徴 (1) IronPythonとは?
  3. マイコミジャーナル:『【ハウツー】IronPython 2.0 - .NET普及への新たな”カンブリア爆発”となるか? (1) Silverlight、DLRの衝撃
  4. @IT:IronPythonプログラミングの始め方
  5. MSDN:『荒井省三のブログ
  6. MSDN:『IronPython and the Dynamic Language Runtime』(IronPythonと動的言語ランタイム)
  7. Wikipedia:『IronPython
  8. 日本Pythonユーザ会
  9. CodeZine:Pythonを始めよう

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

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

もっと読む

この記事の著者

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

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

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

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

この記事をシェア

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

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング