« [ Python2.5 ] 2.5 で導入されたカリー化 | トップページ | [.NET] .NET Framework3 正式版リリース »

2006/11/10

[ Python/.NET] IronPython で py をコンパイル

IronPython で py をコンパイル

IronPython 登場当初から Python ソースファイルのコンパイルが可能 ということは言われていました。実際、コンパイルして .exe ファイルを 作成することができます。

"ironpython コンパイル" で検索するとここが上位に引っかかるらしくて 結構実に来てくださる方がいるのですが、IronPython を VS2005 に統合する 別エントリでがっくりしてしまう方もいらっしゃるようで・・・ すみませんでした(´・ω・`)

さて、本題の IronPython を利用したコンパイルですが、 コンパイル機能は ipy アセンブリ(*)が持っています。 コマンドプロンプトを起動して "ipy -h" と入力するといろいろと オプションを表示してくれます。インタープリタエンジンだけではないんですね。

アセンブリ ( assemblies ) * :
アセンブリと聞いて「え?」と思う方もいると思います。わたしも最初驚いたのですが このアセンブリは作業やアセンブリ言語で書かれたファイルのことではありません。 .NET プラットフォームでの「アセンブリ」とは論理的な実行単位のことです。 .NET プラットフォームでの「アセンブリ」とは複数のモジュール ( モジュールはファイルとほぼ同義 ) が集まったものになります。この概念はあとで重要になってきます。.NET アプリケーションはモジュールが足りないなどアセンブリが不完全だと動作しません。詳しくはインサイド .NET Framework [改訂版]第一回をご覧ください。

コンパイルを実際にやってみましょう。 突然ですがエディタで次のコードを入力して、ファイル名を helloipy.py として保存してください。

print "Hellow IronPython!"
・方法1: ipy.exe を直接使う
コマンドプロンプトを起動します。コマンドプロンプトを起動したら
ファイルを保存したディレクトリまで移動しましょう。

移動できたら次のコマンドを入力します。


ipy.exe -X:SaveAssenblies helloipy.py

helloipy.py を保存したディレクトリにhelloipy.exe と helloipy.pdb というファイルが作られていればコンパイルは成功です。IronPython の Readme には -X:SaveAssemblies は "caching of generated assemblies" ってあるけど、 ( 中身は後述の方法と微妙に異なるけど ) EXE ができて ildasm をかけて内部動作を調べることもできるから 学習用のコンパイルとしてはこれでもいいと思います。

・方法2: pyc.py を使う
pyc.py は IronPython1.01 の Example として公開されているとても有用なモジュールです。 コンパイルのオプションがとてもわかりやすくなっており、PE ファイルだけでなく DLL ファイル の作成も簡単に指定できます。

Usage: ipy.exe pyc.py [options] file [file ...]

Options:
    /res:rfile.resource[,(public|private)]    Include public or private resource file
    /main:main_file.py                        Main file of the project (module to be executed first)
    /out:output_file                          Output file name (default is main_file.)
    /target:dll                               Compile into dll
    /target:exe                               Compile into console executable
    /target:winexe                            Compile into windows executable
    /platform:x86                             Compile for x86 only
    /platform:x64                             Compile for x64 only
    /platform:Itanium                         Compile for Itanium
    /r: or /reference:                        Add referenced assembly
    /? /h                                     This message
pyc.py を使ったコンパイルも簡単です。コマンドラインから

ipy pyc.py /main:helloipy.py

と入力するだけです。helloipy.exe とhelloipy.pdb が作成されていればコンパイルは成功です。 pyc.py では入力されたファイルとその成果物をメッセージとして出力してくれます。
Input Files:
        helloipy.py
Resource Files:
Output:
        helloipy.exe
Target:
        ConsoleApplication

pyc.py は IronPython.Hosting.CompilerSink と IronPython.Hosting.Compiler の wrapper なので自分でこれらのクラスを利用したり、あるいは IronPython.Compiler.* を使って コンパイラを作ってコンパイルということもできますが引数やらオプションやら 面倒なことを考えるよりも素直に pyc.py を使うことをお勧めします。

コンパイルはできました。しかし、作成された helloipy.exe を実行しようとしても エラーが出てしまって実行できません ( 環境変数の設定によっては実行できる方もいるでしょうけど )。 わたしの環境では実行しようとすると次のようなエラーが表示されました(一部編集しました)。

>helloipy

ハンドルされていない例外: System.IO.FileNotFoundException:
ファイルまたはアセンブリ 'IronPython, Version=1.0.60816.1877, Culture=neutral,
PublicKeyToken=31bf3856ad364e35'、またはその依存関係の 1 つが読み込めませんでした。
指定されたファイルが見つかりません。
ファイル名 'IronPython, Version=1.0.60816.1877, Culture=neutral, PublicKeyToken=31bf3856ad364e35' です。

太字の部分に注目してください。「必要なファイルまたはアセンブリが足りない」ので 実行できなかったことがわかります。.NET アプリケーションはアセンブリ単位で動作すること、 アセンブリは複数のファイルで構成されること ( そしてアセンブリ間にも依存関係があること ) を 思い出してください。

今回の場合には IronMath.dll と IronPython.dll の 2 つが必要になっています。 この 2 つのファイルを helloipy.exe とおなじフォルダにコピーすると動作するようになります。

少し面倒になりますが、IronPython で作成したアプリケーションを実行・配布するには、 コンパイルするだけではなく、アセンブリを構成するモジュール ( ファイル ) と、作成した アセンブリが依存しているアセンブリを全部そろえる必要があります。

まとめ: python コードのコンパイル
  1. ipy (オプション) (ソースファイル名)
  2. ipy pyc.py (オプション) /main:(ソースファイル名)
  3. IronPython.Hosting.CompilerSink とか IronPython.Hosting.Compiler とか IronPython.Compiler.* を使って自前でコンパイラコード作成
2 番がお勧め。3 番はマニアックな人向け。
コンパイルしたら依存関係があるファイルを集めて出来上がり(´・ω・`)b

|

« [ Python2.5 ] 2.5 で導入されたカリー化 | トップページ | [.NET] .NET Framework3 正式版リリース »

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: [ Python/.NET] IronPython で py をコンパイル:

« [ Python2.5 ] 2.5 で導入されたカリー化 | トップページ | [.NET] .NET Framework3 正式版リリース »