応用例(RSSの取得)
最後の例として、Web上の情報にアクセスしてみましょう。コードの細かい解説は行いませんが、全体の流れを参考にしてください。
CodeZineではRSS形式にて最新の記事情報を配信しているので、それを読み込んで表示させてみます。
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スクリプトを見てみましょう。
#.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)
<?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では行頭からの空白(インデント)を元に処理する範囲を判断します。条件文であるIF文を例に紹介します。
int i = 1; if (i == 1) { Console.WriteLine("一致"); } Console.WriteLine("終了");
i = 1 if i == 1: print "一致" print "終了"
プログラムのまとめ
最後にプログラムを作成する流れを整理します。
- IronPython.dllとIronMath.dllに参照設定する
- PythonEngineクラスをインスタンス化する
- C#と共有したい変数があればGlobalsプロパティに設定する
- Pythonスクリプトを記述する
- ExecuteFileメソッドを呼び出してPythonスクリプトを実行する
- 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を使い始めてみてはいかがでしょうか。
参考資料
- 『IronPythonの世界』(荒井 省三 著、ソフトバンク クリエイティブ、2007年3月)
- マイコミジャーナル:『【ハウツー】IronPythonを飼いならす - IronPythonの紹介とバージョン1.1の特徴 (1) IronPythonとは?』
- マイコミジャーナル:『【ハウツー】IronPython 2.0 - .NET普及への新たな”カンブリア爆発”となるか? (1) Silverlight、DLRの衝撃』
- @IT:IronPythonプログラミングの始め方』
- MSDN:『荒井省三のブログ』
- MSDN:『IronPython and the Dynamic Language Runtime』(IronPythonと動的言語ランタイム)
- Wikipedia:『IronPython』
- 日本Pythonユーザ会
- CodeZine:Pythonを始めよう