前回は配列を引数で渡し、戻りを配列で受け取る関数を呼び出してみました。
<style=”margin-top: 40px;”/>
Introduction
今回の目的は、パッケージを使います。
PythonもNuget、npm、apt-getよろしくパッケージ管理マネージャー pip が存在します。
英語版Wikiによれば、pipとは、再帰的頭字語で、Pip Installs Packages または Pip Installs Python とのこと。
昔あったLAMEとかと同じですね。古い。
IronPythonからPythonを呼ぶにしても、Python単独でできることは限られます。
画像処理とかグラフの描画など、豊富なパッケージを利用して、開発工数を削減できますし、高品質なアプリを構築できます。
しかしながら、Pythonを使うときは、普通 Python.exe からスクリプトを呼び出しますし、そこでパッケージのインストールを行います。
つまり、今実行している場所が基盤であることが意識できます。
対して、IronPython、つまり.NETで動作しているときは、このあたりが意識しづらいです。
バックエンドでPythonがごにょごにょしているのはわかるのですが、もやもやします。
なので、実際にパッケージを使って見ます。
使うパッケージは簡単で、simplejson を使います。
その名の通り、jsonファイルを扱います。
.NETは標準で.jsonを扱えるのでわざわざこれを使う必要性は薄いのですが…
軽量なパッケージでわかりやすいのがこれだったので… 今回のソースは下記になります
ただし、今回は最終的には
失敗
です。
忘備録として残してあります。
Python側
Pythonのソースは下記になります。
1 | import simplejson |
jsonのファイルパスを読み込んで、辞書データを返すだけです。
ここでは、パッケージの利用と、辞書形式クラスの扱いが肝になります。
C#側
WPFです。Xaml側は省略します。
jsonファイルから値を読み込むキーを指定するComboBox、結果を表示するためのメッセージボックスを呼び出すButtonだけです。
PythonWrapperのメソッドを呼び出すRelayCommandです。
1 | public RelayCommand MessageCommand |
PythonWrapperの中身です。
1 | using System; |
引数に読み出したいjsonファイルのパスを渡すloadメソッドだけです。
戻りは Dicrionary<string, object> を返します。
Pythonが得意とする辞書をそのまま返すということです。
テスト (パッケージインストール前)
さて、ためしにこれを実行してみます。
simplejsonパッケージをインストールする前です。
通常のPythonなら No module named XXX というお馴染みのメッセージが出ます。
IronPythonだとどうなるでしょう。
Microsoft.Scripting.Hosting.ScriptRuntime.UseFile メソッドでpyファイルを渡した瞬間に例外を投げました。
IronPython.Runtime.Exceptions.ImportException がスローされるようです。
テスト (パッケージインストール 失敗編)
Visual Studio からインストール
パッケージをインストールします。
モジュールのインストールは、VisualStudioから実行できます。
Python Environments から IronPythonを選択します。今回は 64bit 環境なので、IronPython 64bit 2.7 を右クリック。
Install Python Package… を選択します。
インストールするパッケージ名を入力して、OKを押下します。
OK
しかし失敗してしまいます。
ログを見ると、
1 | Installing 'pip' package manager. |
とあります。
そもそも pip が入っていない様子。
ensurepip
手動でpipの導入が必要らしいので、Pip in IronPython 2.7.5 に従って、pipをインストールします。
ipy.exe がある場所 (デフォルトは C:\Program Files (x86)\IronPython 2.7、以下 IronPythonディレクトリ) を管理者権限をつけたコマンドプロンプトで開きます。
そして下記コマンドを入力します。
1 | C:\Program Files (x86)\IronPython 2.7>ipy.exe -X:Frames -m ensurepip |
が、失敗します。
ensurepip が無いって言っています。
get-pip.py
ensurepipのインストールがダメでした。
次の施策として、上のメッセージにある、https://go.microsoft.com/fwlink/?LinkId=616663 にアクセスし、get-pip.py をダウンロードし、IronPythonディレクトリへコピーします。
管理者権限をつけたコマンドプロンプトで、IronPythonディレクトリを開き、下記コマンドを入力します。
1 | C:\Program Files (x86)\IronPython 2.7>ipy.exe get-pip.py |
が、これも失敗します。
バージョンアップ
ここでふと気づきます。
システムに入っているIronPythonのバージョンが 2.7.4 でした。
上のensurepipに関するBlogは2.7.5に関する記事で、上の問題は2.7.4で発生していました。
ですので、古いバージョンを削除し、2.7.7を再度インストールします。
アップデートし終わって、再度ensurepipの導入を試みます。
1 | C:\Program Files (x86)\IronPython 2.7>ipy.exe -X:Frames -m ensurepip |
上手くいきました。
では、お待ちかねのsimplejsonをインストールします。
前の同じように、Visual Studioからインストールします。
1 | Installing 'simplejson' |
またしても失敗です。
この _getframe という単語を足掛かりに検索してみます。
すると下記の記事が見つかりました。
しかし、結論から言うと、ここに書いてある方法もダメでした。
Conclusion
今回はまさかの失敗です。
モジュールがインストールできないなんて、Pythonを使う意味が全くありません。
Source Code
https://github.com/takuya-takeuchi/Demo/tree/master/WPF/03_WPF.Python3