A certain engineer "COMPLEX"

.NETでPythonを試してみる 第1回

前回は下準備でした。

Introduction


今回の目的は、WPFからPythonスクリプト、つまり.pyファイルを呼び出します。
また、WPFなので、MVVMを使います。MVVMフレームワークは MVVM Light Toolkit ですが、そのあたりは自由に適宜選択してください。

ソースは下記になります

Python側


Python側のプロジェクトを作成します。
と言っても、Python側はソースを管理し、コーディングの際にインテリセンスを有効にするためだけで、C#側から直接プロジェクトを参照するというわけではありません。

Pythonのプロジェクトは、Python Tools for Visual Studioをインストールした上で、ソリューションに対してプロジェクトを追加する際、下記のテンプレートを選択します。

追加したプロジェクトには、python1.pyだけが存在します。
エクスプローラ上には、Python1.pyprojpython1.pyというシンプル構成です。

次に、Pythonのソースを。

PythonTestというクラスが、showMessageというメソッドを持っているだけです。
目的は、C#側から、このメソッドを呼び出すことです。
つまり、クラスのインスタンス化、クラスメソッドの呼び出し、戻り値の表示、という3つの基礎的な題材をテストできます。

C#側


いつも通り、簡単にMVVMを使用して簡単なプロジェクトを作成します。
今回はボタンを押すと、メッセージボックスが表示され、pythonスクリプトに書かれた、つまりshowMessageメソッドの戻りの値が表示されるというアプリケーションになります。
Xaml側は省略します。

最初に、IronPythonを利用するために、参照を追加します。
C:\Program Files (x86)\IronPython 2.7\PlatformsNet35Net40Sl5 というフォルダが存在します。
それらのうちの一つを選び配下から、IronPython.dllMicrosoft.Scripting.dllMicrosoft.Dynamic.dll をプロジェクトに追加します。
これでプロジェクトの設定は終了です。

次に、Pythonを呼び出す側のコードです。

ScriptRuntime 変数は、Microsoft.Scripting.Hosting.ScriptRuntime 型で、Pythonの実行環境を表します。
次のソースの IronPython.Hosting.Python.CreateRuntime メソッドの戻りでもあります。
UseFile メソッドには呼び出したいPythonファイルを指定します。戻りを dynamic 型にして、メンバ変数に格納します。
_PythonObject メンバ変数から PythonTest クラスをインスタンス化して、_PythonTest メンバ変数に格納します。

そして、ShowMessage メソッドで、pythonの showMessage 関数を呼び出します。
dynamic型なので、コンパイル時にエラーは解決できませんので、記述が間違っていてもエラーになりませんので注意が必要です。

見たままです。
ScriptRuntimeを生成し、実行したいPythonスクリプトをパス指定しているだけです。
MessageDialogは単純に System.Windows.MessageBox.Show メソッドを呼ぶためだけのinterfaceです。

テスト


実際に実行してみます。
サンプルソースをビルドすると実行ディレクトリに、pythonsフォルダが生成され、Python1.pyファイルがコピーされます。
このファイルはPythonプロジェクトのファイルそのものです。

実行するとボタンが一つ。

ボタンを押すと、Python1.pyのshowMessageの戻りの内容が表示されます。

アプリを終了し、Python1.pyのshowMessage の内容を書き換え、再度実行するとメッセージの内容が書き換わっているのがわかります。

Conclusion


簡単に実行できました。
Pythonの実行処理を分離したので、I/Fさえ維持すれば、呼び出す対象のライブラリをPythonからC++にする!!とかいう選択も可能になるでしょう。
このあたり、MVVMできちんと分離してあるのが良い感じです。

Source Code

https://github.com/takuya-takeuchi/Demo/tree/master/WPF.Python1

コメントを残す

メールアドレスが公開されることはありません。

%d人のブロガーが「いいね」をつけました。