L'Isola di Niente
L'Isola di Niente » .NET Tips » IronPython の導入と基本

IronPython の導入と基本

IronPython の導入方法と簡単な使い方を解説します。
ココでは執筆時点(2011.05)最新版である version 2.7 について

インストール

IronPython.net /

codeplex もありますが上記がメインになるようです。
Download IronPython をクリックしていけばダウンロードページにたどり着き msi 版が落とせます。

ちなみに zip 版もありますが Python モジュール(ctypes 等)は zip 版には含まれていません。
素直に msi 版でインストールを行うことを勧めます。

ちなみに msi は 32bit なので x64 環境の Windows では (x86) が付いたディレクトリに展開されます。

img/ipydir.png

exe 名に 64 が付いたものは x64 環境では 64bit で動作します。
末尾に w が付いている exe は CPython の pythonw.exe 同様に端末ウインドを出さずに実行できます。
Linux 等と違い Windows は CUI と GUI でエントリポイントが違う為に使い分ける必要があります。

パスを通す

パスを通せば cmd.exe 等から ipy64 と exe 名の拡張子を省いた名前だけで起動できます。
簡単に説明すると Windows 7 であれば
コンピューターを右クリックしてプロパティ
システムの詳細設定をクリック
環境設定タブの「環境変数」ボタンをクリック
システム環境変数にセミコロン区切りでフルパスを書き加えるかユーザー環境変数に Path を新規作成する

これで cmd.exe からは ipy 又は ipy64 と打ち込むだけでインタラクティブシェルが利用できます。
又コマンドラインオプションにファイル名を渡せば *.py の実行もできるようになります。

関連付け

CPython ならインストールするだけで関連付けが行われますが IronPython は自前で行う必要があります。
主に IronPython を利用するのであれば *.py, *.pyw に関連付けてしまいましょう。

*.py をテキストエディタに関連付け
*.pyw を ipyw64.exe に関連付け(私の Windows 7 が 64bit なので)

と筆者は行っております、GUI アプリを作るなら拡張子を pyw で作るという方向で。
Windows は Linux のように実行をパーミッションで振り分けできませんので拡張子を変えて利用します。
これでたとえば、下記はファイルドロップで画像を表示する簡単な GUI アプリケーションです。

main_window.py
# -*- coding: UTF-8 -*-

import clr

clr.AddReferenceByPartialName("PresentationCore")
clr.AddReferenceByPartialName("PresentationFramework")
clr.AddReferenceByPartialName("WindowsBase")

from System import *
from System.Windows import *
from System.Windows.Controls import *
from System.Windows.Media.Imaging import *

class PicViewWindow(Window):
    def __init__(self):
        self.Title = "PicView"
        self.Drop += self.on_drop
        self.AllowDrop = True
        self.Width = 300
        self.Height = 300
        self.image = Image()
        self.Content = self.image

    def on_drop(self, sender, e):
        filename = e.Data.GetData(DataFormats.FileDrop)[0].ToString()
        self.image.Source = BitmapImage(Uri(filename))

def main():
    Application().Run(PicViewWindow())

if __name__ == "__main__":
    main()

picview.pyw
import main_window
main_window.main()

という2つのファイルを用意し上記関連付けを行っておく。
picview.pyw を W クリックしてみる。

img/picview.png

これでコードを編集したい時は *.py を W クリック、実行時は *.pyw を W クリックで使えます。
アイコンが違うので解りやすいしこのほうがコード分割も行いやすい。
*.py のファイルを編集しようとしてつい W クリックして実行させてしまうのはコレで防ぐことができます。

CUI アプリを作ってみよう

IronPython 2.6 は .NET Framework も CPython モジュールも使えます。
ここでは環境変数を書き出すアプリケーションを例として作ってみます。
尚、すべて UTF-8 で解説しますのでテキストエディタの文字コードに注意してください。
.NET Framework をよく解っているならこのように書くと思います。
# -*- coding: UTF-8 -*-

import System

# IronPython は clr なので \n では LF 固定になってしまう
nn = System.Environment.NewLine

# IDictionary が返る
dic = System.Environment.GetEnvironmentVariables()
result = ""
# DictionaryEntry に展開
for ent in dic:
    result += ent.Key + nn + ent.Value + nn + nn

sr = System.IO.StreamWriter("env.txt")
sr.Write(result)
sr.Close()

しかし前回説明したように msi 版 IronPython をインストールすれば標準 Pyhton モジュールも使えます。
つまり os モジュールがあるので(sys.path.append() は不要)
# -*- coding: UTF-8 -*-

# 環境変数の書き出し

import os

keys = os.environ.keys()
result = ""
for key in keys:
    result += "%s\n%s\n\n" % (key, os.environ[key])

f = open("env.txt", "w")
f.write(result)
f.close()

という CPython と同様な書き方でもそのまま動きます。

ところで \n の扱いですが、StreamWriter では LF で書き出されますと上で書いていますけど、
open から write() を利用すると CPython と同様な CR/LF に変換されて書き出されるようです。
動作が微妙に違うので注意してください。

実は IronPython には nt という os モジュールの代替が 1.0 の時から組み込まれています。
標準モジュール付属になった今ではもう使わないかもしれないけど一応。
# -*- coding: UTF-8 -*-

# 環境変数の書き出し

import nt

keys = nt.environ.keys()
result = ""
for key in keys:
    result += "%s\n%s\n\n" % (key, nt.environ[key])

f = open("env.txt", "w")
f.write(result)
f.close()

尚、ここで書き出される env.txt はすべて BOM 無しの UTF-8 になります。
open() 組込み関数も文字コード指定無しの System.IO.Stream* も UTF-8 で読み書きなので注意してください。
他の文字コードを扱う場合は StreamWriter で文字コードを指定して行うようにしましょう。
Copyright(C) sasakima-nao All rights reserved 2002 --- 2017.