python embedded で Portable な Python/numpy/matplotlib 環境つくるお
Portableな Python 環境がほしいなー
ということで、Python embeddedというのを試してみました!
公式ドキュメント
4. Windows で Python を使う — Python 3.11.0b5 ドキュメント
VCランタイムをインストール
公式ドキュメントにある通り、VCランタイムが必要ですので入れときます。
開発環境ならすでに入ってる可能性大ですが、配布時には必要になるので忘れないように。
Latest supported Visual C++ Redistributable downloads | Microsoft Learn
Python Embeddedをダウンロード
python公式サイト(Python Releases for Windows | Python.org)あたりから
Windows embeddable package (64-bit)
てのをダウンロードします。現時点で最新の3.11 じゃないのは
↓ここら辺を参考にさせていただきました m(_._)m
zip展開後の準備
- ダウンロードしたZIPを D:\python3.10-emb に展開します
- python310._pthファイルをエディタで編集します
# Uncomment to run site.main() automatically
import site # <-- ここのコメントを外す
import site を有効にすることで自動的に site.main() が実行されます。
site.main()は公式ドキュメントによると
モジュール検索パスに標準のサイト固有ディレクトリを追加します。
とあるので、ZIPを展開したパスを「サイト固有ディレクトリ」として追加するために必要なもの、ということのようです。
pipのインストール
pipの公式(?)
GitHub - pypa/get-pip: Helper scripts to install pip, in a Python installation that doesn't have it.
より、get-pip.py スクリプトを入手して実行します。
Windows版curlだと -sSL はエラーになるのでオプションなしで。
PS D:\python3.10-emb> curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
PS D:\python3.10-emb> .\python.exe get-pip.py
なんやかんやあって
Successfully installed pip-22.3 setuptools-65.5.1 wheel-0.38.2
おk
numpyとかインストール
PS> .\python.exe -m pip install numpy matplotlib
PyTorch CPU版なら
PS> .\python.exe -m pip install torch torchvision
とか。
これで学習用には十分かな
と思ってちょろっと確認してみたら、、matplotlib が動きませんでした。。orz
UserWarning: Matplotlib is currently using agg, which is a non-GUI backend, so cannot show the figure.
plt.show()
色々調べたところ、matplotlibで描画するにはGUIにアクセスするBackendが必要で、インストーラ版Python には標準で入っているtkinterがEmbeddedには無いのが原因らしいです。。(Embeddedに含まれてない理由は不明。。Tcl/Tkのライセンスの問題?)
Usage — Matplotlib 2.0.2 documentation
を見るとほかのBackendも使えるようなので切り替えることにします。
WxPythonを使う
バックエンドモジュールはいくつかあるようですが、ドキュメントにも少し記載があったwxpythonをインストールすることにします。pipでinstallするだけ。
次に、Lib\site-packages\matplotlib\mpl-data にある matplotlibrc ファイルを編集して、matplotlibのバックエンドを変更します。
##backend: Agg # <-- こんなのがあるところに ↓これを追加
backend: WxAgg
これでmatplotlib で図が表示できるようになりました! わーい。
ちなみに matplotlibrc を編集したくない場合は、ソース中に
impot matplotlib as mpl
mpl.use('WxAgg')
のようなコードを最初に入れておくとバックエンドを指定できます。
Sandboxで確認してみる
とりあえずテスト環境として Windows Sandbox を使って動作を確認してみます。
- Sandbox起動
- D:\python3.10-emb を ZIPで固めたやつをSandboxにコピーして展開
(フォルダを直接コピーもできるけど、ファイル数が多くてめちゃ時間がかかる) - VCランタイムのインストール
- あとはお好みでw
numpy+matplotlibがちょろっと動くことは確認できました!
PyTorchとか本格的なものは試せていませんが、足りないものはpipで入れていけば動くんじゃないかと。。