必要性
会社などでpythonで書いたツールを一般ユーザーに使用させようとする時、各ユーザーのPCにpythonがインストールされていないことがある。その様な場合に、各PCにインストールせずに使えるpython処理系が欲しくなる。
その選択肢が色々と増えてきたので、以下に整理する。
なお以下に示すソフトのうちのいくつかは、サービスを提供するサーバーをデモ的に提供しているものもあるが、セキュリティ的な観点からそれは使用しない前提とする。
但し、Python in ExcelのみはMicrosoftの提供するクラウドサーバーを用いることが必須である。
Python in Excel
Excelのシート上でpythonを実行するもの
- 使用環境の準備方法: Python in Excelの有効となっているバージョンのExcelを使用
- pythonコードの実行場所: Microsoft Cloudのサーバー上
- ライブラリーの追加の可否: 不可
JupyterHub
Jupyter NotebookやJupyterLabは通常はローカルPC上に専用のWebサーバーが立てられて実行する。このWebサーバー部分を共用のPCにすることで、ローカルPC側にインストール不要としたものがJupyterHubである。
- 使用環境の準備方法: 共用PC(Linux PCまたはWSL2をインストールしたWindows PC)上にJupyterHubのディストリビューション(Zero to JupyterHub for KubernetesまたはThe Littlest JupyterHub)をインストールし設定する
- pythonコードの実行場所: 共用PC
- ライブラリーの追加の可否: 可
JupyterLite
Jupyter NotebookやJupyterLabをwasmを用いてブラウザ上で実行するようにしたもの
- 使用環境の準備方法: 共用PC上にJupyterLiteを提供するWebサーバーを準備
- pythonコードの実行場所: 各ユーザーPCのブラウザ上
- ライブラリーの追加の可否: 可
xlwings Lite
- 使用環境の準備方法: 各PCでOffice add-inである"xlwings lite"をインストール
- pythonコードの実行場所: 各ユーザーPCのブラウザ上
- ライブラリーの追加の可否: 可
PyScript
HTMLファイル中に書いたpythonのコードをwasmを用いてブラウザ上で実行するようにしたもの
- 使用環境の準備方法: 共用PC上にPyScriptを提供するWebサーバーを準備
- pythonコードの実行場所: 各ユーザーPCのブラウザ上
- ライブラリーの追加の可否: 可
Pyodideを使用したソフト
JupyterLiteと同様にpyodideを用いて、ブラウザ上でpythonコードを実行する様にしたソフトがいくつかある。Pyodide: Related Projectsを参照のこと。
- 使用環境の準備方法: 共用PC上にそのソフトを提供するWebサーバーを準備
- pythonコードの実行場所: 各ユーザーPCのブラウザ上
- ライブラリーの追加の可否: 可
WinPython
python処理系とライブラリーなどのファイル一式を適当なディレクトリーにコピーするだけで、pythonを実行できるようにしたもの。これをファイルサーバーに置いて複数のユーザーで使う場合、同じファイルを同時に読み書きすることによる問題を回避できるならば、各PCにインストールせずに使えるpython処理系となる。
- 使用環境の準備方法: ファイルサーバー上にWinPythonのファイル一式をコピーし、問題回避策を織り込んだバッチファイルを準備する
- pythonコードの実行場所: 各ユーザーPC
- ライブラリーの追加の可否: 可
WinPythonの共有使用による問題の回避方法
以下の2点の問題を回避する必要があると私は考えた。これ以外にも回避すべき問題がある可能性はあり、その様な問題は非常に低い確率で発生して発覚しづらいものかも知れない。
WinPythonの共有使用は、この点を理解して自己責任で運用のこと。
回避すべき問題1: バイトコードキャッシュファイルの競合
pythonはライブラリーファイルを読み込んだ時に、その処理時間の削減のためのバイトコードキャッシュファイルの有無を確認し、無い場合にはバイトコードキャッシュファイルを作成する。
発生確率は低いが、このファイル作成が複数ユーザーの同時実行により競合する可能性がある。
このキャッシュファイルへの複数ユーザーからのアクセスの競合の回避と、実行速度の向上のため、キャッシュファイルを使用するPCのローカルのディレクトリーに作ることとすると良い。
そのために、キャッシュファイル用のディレクトリーをPC上に作成し、そのディレクトリーのパスを環境変数PYTHONPYCACHEPREFIXに設定すれば良い。
回避すべき問題2: ライブラリーのインストールまたは更新の競合
複数ユーザーが同時に同じライブラリーのインストールまたは更新を行えば、競合する。
これに対する回避策としては、以下の2つの選択肢がある。
- ライブラリーのインストールや更新を特定の者のみが行う運用とする
- ライブラリーを各ユーザーPC上にインストールすることとする
このためには、pipコマンドにオプション--userを付けて実行すれば良い
この2つの選択肢のうち後者は、ユーザーによって使用するライブラリーを変えることができるという利点もある。
WinPythonをファイルサーバー上に置く場合の注意
コマンドプロンプトの一部の機能などが、ネットワーク上のファイルパスに対応していないゆえ、ネットワークドライブを設定し、そこからのパスを用いるようにすると良い。
python.exeやライブラリーをネットワーク上から読み込むため、ローカルにpythonをインストールした場合と比べて、コードを起動するまでの時間がかかる。特にバイトコードキャッシュファイルの作成が必要な場合には、使用しているライブラリーが多いほど起動が遅くなる。例えばJupyterLabの初回起動には、私の試した環境では10分近くかかった。上記の回避策1を行っている場合、初回以降の起動ではバイトコードキャッシュファイルの作成の可否のチェックのみがライブラリーに関するネットワーク上のファイルへのアクセスになるゆえ、だいぶ起動が早くなるが、それでもJupyterLabの起動が1,2分かかる。
コードの起動後は、各PC上のCPU上の処理となるため、ローカルにインストールした場合と同等の速度となる。WinPythonを用いた場合は、他のWASMを使う選択肢の方法よりも実行は速いことが期待できる。
番外的選択肢:フリーソフトに同梱のpythonを使用
いくつかのフリーソフト(FreeCAD, Inkscape, Gmsh, Blenderなど)は、何らかの形でpythonを利用しており、その様なソフトをインストールすると、python処理系も一緒にインストールされる。
もし、その様なソフトが一般的にインストールされている環境であり、その同梱されているpythonのバージョンが適当であるならば、それを用いるのも一つの選択肢である。
- 使用環境の準備方法: フリーソフトに同梱のpython処理系を利用する様に設定したバッチファイルの準備
- pythonコードの実行場所: 各ユーザーPC
- ライブラリーの追加の可否: 可(該当のフリーソフトの実行に影響しない範囲に限定)
まとめ
以上に示したように、インストールせずに使えるpythonの選択肢は色々とある。それらのうち、WASMを用いている選択肢は、実行速度が劣るゆえ、可能であれば JupyterLiteのデモサイトで試すと良い。
Python in Excelは、有名ではあるが、クラウド上で実行されることとライブラリーの追加が出来ないことが気になる点である。xlwings liteが出てきたため、そちらも今後注目を集めるものと思われる。
この資料が インストールせずに使えるpythonの選択肢を考える上で参考になれば幸いである。