[ Python/.NET] IronPython で py をコンパイル
IronPython 登場当初から Python ソースファイルのコンパイルが可能 ということは言われていました。実際、コンパイルして .exe ファイルを 作成することができます。
"ironpython コンパイル" で検索するとここが上位に引っかかるらしくて 結構実に来てくださる方がいるのですが、IronPython を VS2005 に統合する 別エントリでがっくりしてしまう方もいらっしゃるようで・・・ すみませんでした(´・ω・`)
さて、本題の IronPython を利用したコンパイルですが、 コンパイル機能は ipy アセンブリ(*)が持っています。 コマンドプロンプトを起動して "ipy -h" と入力するといろいろと オプションを表示してくれます。インタープリタエンジンだけではないんですね。
アセンブリ ( assemblies ) * :
アセンブリと聞いて「え?」と思う方もいると思います。わたしも最初驚いたのですが このアセンブリは作業やアセンブリ言語で書かれたファイルのことではありません。 .NET プラットフォームでの「アセンブリ」とは論理的な実行単位のことです。 .NET プラットフォームでの「アセンブリ」とは複数のモジュール ( モジュールはファイルとほぼ同義 ) が集まったものになります。この概念はあとで重要になってきます。.NET アプリケーションはモジュールが足りないなどアセンブリが不完全だと動作しません。詳しくはインサイド .NET Framework [改訂版]第一回をご覧ください。
コンパイルを実際にやってみましょう。 突然ですがエディタで次のコードを入力して、ファイル名を helloipy.py として保存してください。
print "Hellow IronPython!"
ファイルを保存したディレクトリまで移動しましょう。
移動できたら次のコマンドを入力します。
ipy.exe -X:SaveAssenblies helloipy.py
helloipy.py を保存したディレクトリにhelloipy.exe と helloipy.pdb というファイルが作られていればコンパイルは成功です。IronPython の Readme には -X:SaveAssemblies は "caching of generated assemblies" ってあるけど、 ( 中身は後述の方法と微妙に異なるけど ) EXE ができて ildasm をかけて内部動作を調べることもできるから 学習用のコンパイルとしてはこれでもいいと思います。
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
ipy pyc.py /main:helloipy.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 で作成したアプリケーションを実行・配布するには、 コンパイルするだけではなく、アセンブリを構成するモジュール ( ファイル ) と、作成した アセンブリが依存しているアセンブリを全部そろえる必要があります。
- ipy (オプション) (ソースファイル名)
- ipy pyc.py (オプション) /main:(ソースファイル名)
- IronPython.Hosting.CompilerSink とか IronPython.Hosting.Compiler とか IronPython.Compiler.* を使って自前でコンパイラコード作成
コンパイルしたら依存関係があるファイルを集めて出来上がり(´・ω・`)b
| 固定リンク
この記事へのコメントは終了しました。
コメント