はじめに
今や誰でもPython書ける時代に。(!?)
Windows Server上で、多人数が作ったコードが動く、
バッチ処理やテスト用のPyhonの実行環境を作るニーズがあった。
「LambdaとかECSとか使っとけば?」で話が済まない場合、
環境を準備する側の都合としては、色々考える必要がある。
要件を整理すると…
やりたいこと
- 毎度クリーンな環境でPython実行させたい。
- 気軽にDockerコンテナ使える環境を使える環境でない。
⇒でも、将来的にDocker使用を見越した準備をしておきたい。 - Python書かせるユーザーが多数、レベルも様々。
⇒ある程度、冪等性を意識させたい。 - コンテナのように同時にたくさん実行させたい。
- pyenvとか色々あるのは知ってるが、極力公式環境で作りたい。
- いい感じのができたら標準テンプレとして使いたい。
これを解決するために、タイトルの通り、
「venvとPowerShellでお手軽Python仮想実行環境」を作った。
今回は、以下3点を意識した。
意識したこと
- venvを使ったクリーンな環境の準備
- 同時実行のために実行毎にユニークなvenv環境を作る
- Pythonのライブラリはrequirements.txtで管理
実践編
今回作ったもの
- やりたいことを実行させるPowerShell(bat.ps1)
- サンプルとなるmain.pyファイル
- 同じくサンプルのrequirements.txt
全部GitHubに上げている。
これで、「main.pyとrequirements.txtだけ弄っておいて~」とすれば、
最低限、作成者側で保守性の良いコードを書いてくれるはず。
0. ps1の呼び出し
実行環境によってps1の実行で詰まったりしそうなので、
ワンライナーでポリシー変更も併せて書く。
set-executionpolicy remotesigned -Scope CurrentUser | .\bat.ps1
1. ps1ファイル中身
Python実行させるDockerfile書いている要領で書く。
今後、Dockerfileとなったところでちょこっと書き換えれば良い。
UUIDで毎回ユニークなvenv環境を作らせるようにした。
# 01.setting
$venvuud = [Guid]::NewGuid().ToString()
$venvFolder = "venv_" + $venvuud
# 02.build venv environment
python -m venv $venvFolder
& (".\" + $venvFolder + "\Scripts\Activate.ps1")
# 03.python
python -m pip install --upgrade pip
python -m pip install -r requirements.txt
python -m pip list
python main.py $venvuud
# 04.end
deactivate
Remove-item -Force $venvFolder -Recurse
2. pythonサンプル
Pythonへ引数の渡し方も示しておく。
ファイルを出力させる例として書いておいた。
import matplotlib.pyplot as plt
import numpy as np
import sys
if __name__ == '__main__':
uuidStr = sys.argv[1]
plt.figure(figsize=(6,6))
for i in range(5):
plt.plot([1,2,3],[np.random.rand(),np.random.rand(),np.random.rand()])
filename = uuidStr +".png"
plt.savefig(filename)
print(filename)
3. requirements.txt
バージョン指定のお作法的なところを、
人気ライブラリで書いておく。
# no version
numpy
# with version
pandas == 2.0.2
# with major version
matplotlib == 3.*
最後に
「実行可能なPythonを」と指定したのに.ipynb形式で渡されたり、
execがたくさん埋め込まれ、作成者環境でしかうまく動作しなかったり、
変なところで詰まってしまって悲しくなること、ありますよね。
テンプレートをお渡して、テンプレートに合わせて作ってもらった方が、
お互いのため。手戻りも少なくなるはず…