A certain engineer "COMPLEX"

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

前回はパッケージのインストールに失敗しました。

謝罪


まずはじめに。
IronPython の使用を諦めることにしました。
理由はモジュールのインストールができなかったことです。
一番シンプルだと思っていた simplejson すらまともにできませんでした。
正確には、インストールはできましたが、いざ import simplejson すると、動かない。
他にも、

  • CPythonと同じ方法でC言語ベースのライブラリと相互運用ができない
  • 2017/03/11時点で、Issueの数が700越え。あまりにも利用者の声に応える余裕がない。

結局、ネット上で調べると、動かないという情報ばかり、でこれ以上貴重な時間を費やすことはできない、という判断に至りました。
4日以上使いましたが、本当に無駄骨に終わりました。

Introduction


なので、方針を変えます。
「.NETからPythonを使う」という目的を達するなら、思いつく限り、

  • Pythonをコマンドプロンプトで呼び出し、標準出力で結果を受け取り解析
  • Pythonをコマンドプロンプトで呼び出し、ファイルで結果を受け取り解析
  • Pythonで動作しているWebサービスのAPIを叩く

あたりでしょうか。
1,2番目は面倒ですし、なによりださいので、3番目を利用します。

Webサービスなら、WCFによって簡単に.NETから呼び出せます。
というのも、Pythonをコマンドプロンプトで呼ぶと、呼び出しのコストが大きいと思います。
試してみた限り、Pythonの起動は遅いです。おそらく必要なモジュールなどを読み込んでいるからだと思うのですが、無視できない間隔で待たされます。
なので、起動コストを無視するために、常に起動しっぱなしにして、必要なときに必要な演算結果を受け取る形式がベスト。

ですので、今回はPythonでシンプルなRESTfulサービスを作成し、C#アプリからアクセスします。
そのために軽量なWebフレームワークであるPythonモジュール Flask を使用します。
Flaskについては下記を。

また、使用するPythonはMinicondaを使用します。

今回のソースは下記になります


Python


Flaskインストール

さくっとインストールします。
下記に従うだけです。

以上でインストールは完了です。

動作確認

最小のRESTfulなアプリが下記ドキュメントにあるのでファイルに保存します。

以上のソースを下記で起動します。

Webブラウザで http://127.0.0.1:5000/ へアクセスすると、下記が表示されます。

jsonで返ってきています。
以上でFlaskのテストは完了です。

C#


SOAPであるならば、エンドポイントを参照して、クライアントクラス等の生成が自動でできますが、RESTにそんな便利機能はありません。

Microsoft.Net.Http

RESTful APIへのアクセスです。RESTful APIへのアクセスはライブラリを使って簡略化します。
幸いMicrosoft.Net.HttpというライブラリがあるのでNuGetで導入します。

BCL Team Blog
Overview This page is about the Microsoft.Net.Http package. Our first release announcement can be found here.   Release Notes Microsoft HTTP Client Libr...

Newtonsoft.Json

RESTful APIから返ってきたjsonの逆シリアライズをNewtonsoft.Jsonで実行します。
こちらもNuGetで導入します。

Json.NET - Newtonsoft
Json.NET is a popular high-performance JSON framework for .NET

ソース

WPFです。Xaml側は省略します。
Xamlは、結果を表示するためのメッセージボックスを呼び出すButtonだけです。
ViewModelもButtonに対応するコマンドだけです。

まずは、先ほどのjsonに対するModelクラスです。

次はViewModelです。

テスト


実際に実行してみます。
C#側を起動する前に、PythonでRESTサービス側を起動しておいてください。
ボタンを押下すると、REST APIのjsonを受け取り、そのjson唯一のメンバーである、Helloキーに対応する値をメッセージボックスで表示します。

Conclusion


IronPythonが期待外れに終わった今、Pythonの既存資産を生かす方法として、Webサービス化は有用な手段です。
単純に結果を呼び出すだけならRESTful APIは簡単で魅力的です。

Source Code

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

コメントを残す

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

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