LoginSignup
0
5

venvとPowerShellでお手軽Python仮想実行環境

Last updated at Posted at 2023-06-26

はじめに

今や誰でもPython書ける時代に。(!?)
Windows Server上で、多人数が作ったコードが動く、
バッチ処理やテスト用のPyhonの実行環境を作るニーズがあった。
「LambdaとかECSとか使っとけば?」で話が済まない場合、
環境を準備する側の都合としては、色々考える必要がある。

要件を整理すると…

やりたいこと

  • 毎度クリーンな環境でPython実行させたい。
  • 気軽にDockerコンテナ使える環境を使える環境でない。
    ⇒でも、将来的にDocker使用を見越した準備をしておきたい。
  • Python書かせるユーザーが多数、レベルも様々。
    ⇒ある程度、冪等性を意識させたい。
  • コンテナのように同時にたくさん実行させたい。
  • pyenvとか色々あるのは知ってるが、極力公式環境で作りたい。
  • いい感じのができたら標準テンプレとして使いたい。

これを解決するために、タイトルの通り、
venvとPowerShellでお手軽Python仮想実行環境」を作った。

今回は、以下3点を意識した。

意識したこと

  • venvを使ったクリーンな環境の準備
  • 同時実行のために実行毎にユニークなvenv環境を作る
  • Pythonのライブラリはrequirements.txtで管理

実践編

今回作ったもの

  1. やりたいことを実行させるPowerShell(bat.ps1)
  2. サンプルとなるmain.pyファイル
  3. 同じくサンプルの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がたくさん埋め込まれ、作成者環境でしかうまく動作しなかったり、
変なところで詰まってしまって悲しくなること、ありますよね。

テンプレートをお渡して、テンプレートに合わせて作ってもらった方が、
お互いのため。手戻りも少なくなるはず…

0
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
5