Python: 仮想環境(virtual environment)venvについての備忘録(追記あり)

Python

Pythonと仮想環境

Pythonにおいてモジュールをインストールする際、何も考慮せずにpip3でインストールするとデフォルトではそのMAC(PC)全体に係るグローバル環境(global python environment)にインストールされる。(ここでモジュールとはbrewやpip3等のコマンドで外部からインストールするパッケージのことを指す)

そして、Python自身も、pip3でインストールしたモジュールも、インストールした後それぞれが日々アップデートされている。

これらが日々アップデートされて行くと、Pythonとモジュールの、そしてモジュール同士の関係も日々アップデートされる。

即ち、あなたのMac(PC)におけるPythonの実行環境は、今日使ったその時の状況から日々変わって行くと言う事。

実行環境が変わると、その変化は当該Python、モジュールを使用して今作成しているPythonのプログラムに影響を及ぼす事になる。

Pythonを使うにあたって、この実行環境の変化を管理する方法に仮想環境(virtual environment)がある。

その日使って終わり、と言う簡易なプログラム以外、長期に渡りアプリなりプログラムを作る場合には、プロジェクト毎に仮想環境を作って環境を管理する方法が望ましい。

その仮想環境、今まではvirualenv, pyenv等色々な仕組みがあったが、Python 3.3以降は公式のデフォルト環境はvenv。

公式チュートリアルInstalling packages using pip and virtual environments-Creating a virtual environmentを参考に。(リンク先を修正 2022/1/25)

最初の設定

python3 -m venv env

“python3 -m venv”の後に続く2つ目の引数(argument)はチュートリアルでは一般的にはenvとある。

この2つめの引数、人によっては、プロジェクト名風の人や、venv、.venvとする人もいると言う理解。

プロジェクト名は元々のフォルダに付けているだろうから、ここは一般的に使われる方法を踏襲する。
また、当初virtualenvと見分けるためにもvenvとした方が良いのかも、と思っていたが、そこはPython2はvirtualenv、Python3はvenv、と言う分けで良さそう。

と言う事で、Python3ではvenv、Python2ではvirtualenvを使う事とし、仮想環境保存先のフォルダ名は当面envとする。

python3 の後に続く-mオプションは、指定したモジュール(この場合はvenv)をスクリプトとして実行することを意味する。(追記 2022/1/27)

作成すると”env”フォルダができる。
実行したフォルダ内のツリーを2段階分表示

% tree -L 2
.
├── README.md
├── __pycache__
│   └── app.cpython-39.pyc
├── app.py
├── env
    ├── bin
    ├── include
    ├── lib
    └── pyvenv.cfg

チュートリアルにある下記の注意書き通り、gitにおいてはここで作ったenvフォルダはgitignore等でバージョン管理に含めない様にするのが吉。

Note: You should exclude your virtual environment directory from your version control system using .gitignore or similar.

その意味でもやはり作成するフォルダ名は一般的なもの(ここではenv)に統一した方が良いだろう。そうすればgitignoreを定型文でのルーティン作業に出来る。

仮想環境を起動する(Activate)

作った仮想環境を起動するには、下記の通り”source [設定したフォルダ名]/bin/activate”を実行。

source env/bin/activate

“source” コマンドは引数で指定したファイル(この場合activateスクリプト)を読み込み、現在のシェルで実行するコマンド。代わりに”.”(ドット)としても実行出来る。

sourceコマンドを下記の通り実行した後、出てくるプロンプトの頭に先程第2引数で指定した文字列(今回はenv)が付いていれば正しく起動している。

% source env/bin/activate
(env) %

仮想環境の実行前後では実行されているPython3が違う。

# venv起動前
% which python3
/Users/[Usename]/.pyenv/shims/python3
% python3 -V
Python 3.9.9
# venv起動
% source env/bin/activate
# venv起動後
(env) % which python3
/Users/[Username]/~/env/bin/python3
(env) % python3 -V     
Python 3.9.10

モジュールを仮想環境にインストール

モジュールは”python3 -m pip install モジュール名”でインストール出来る。
例えばrequestsをインストールする場合は下記の通り。

(env) % python3 -m pip install requests

因みに、従前通り”brew install モジュール名”でもインストール出来るが、しばらくはチュートリアル通りのインストールをしてみる。

仮想環境内にインストールしたモジュールをアップデートする

インストールしたモジュールをUpdateするには”python3 -m pip install –upgrade モジュール名”を実行。下記はrequestをアップデート。

(env) % python3 -m pip install --upgrade requests

仮想環境内のインストール状況をリストに書き出す

今の仮想環境にインストールされているモジュールとそのバージョンをリストにして書き出す。

(env) % python3 -m pip freeze
alembic==1.7.5
attrs==21.2.0
(中略)
SQLAlchemy==1.4.26
toml==0.10.2
urllib3==1.26.8
Werkzeug==2.0.2

上記はターミナルに書き出すだけだが、テキストファイル”requirements.txt”として出力する場合は下記のコマンド。

(env) % pip freeze > requirements.txt

書き出したリストを元に、別のフォルダに作成した仮想環境に同じモジュールをインストールしてコピーを作る。

上記で出力したテキストファイル”requirements.txt”を利用して、新規作成した仮想環境に同じモジュールの組み合わせをインストールする為には”pip install -r [テキストファイル名]”を実行する。

% pip install -r requirements.txt
Collecting alembic==1.7.5
  Using cached alembic-1.7.5-py3-none-any.whl (209 kB)
Collecting attrs==21.2.0
  Using cached attrs-21.2.0-py2.py3-none-any.whl (53 kB)
(中略)
Collecting SQLAlchemy==1.4.26
  Using cached SQLAlchemy-1.4.26-cp39-cp39-macosx_10_14_x86_64.whl (1.5 MB)
Collecting toml==0.10.2
  Using cached toml-0.10.2-py2.py3-none-any.whl (16 kB)
Collecting urllib3==1.26.8
  Using cached urllib3-1.26.8-py2.py3-none-any.whl (138 kB)
Collecting Werkzeug==2.0.2
  Using cached Werkzeug-2.0.2-py3-none-any.whl (288 kB)
Installing collected packages: Werkzeug, .....
Successfully installed Flask-2.0.2 .....

これで元の仮想環境と同じ環境が出来る。
不要なパッケージがあれば、txtファイルを削れば良い。

DockerでPythonを使用する場合の注意(追記 2022/1/27)

最後に、Docker等でPythonを使う場合には別の考え方が必要。
自走プログラマー ~Pythonの先輩が教えるプロジェクト開発のベストプラクティス120より。

Docker等のコンテナを使う場合には、このコンテナ自体が独立した、ある意味仮想環境になっているので、更なるPythonの仮想環境構築は不要との事。

DockerでPythonを使う時はその独立したコンテナの中の環境でそこのPythonを使用し、自Mac(PC)でPythonを使用する場合には、他フォルダから独立する為に別途フォルダを準備してそこに仮想環境を作る。と理解しておく。

“組合せによってはベストプラクティスがベストではなくなることもあるため、盲信せず、メリットをよく確認”するのが大事との事。心したい。

以上、お陰で頭の整理が出来た。
今後は、自Mac(PC)で使用する分には前回のpyenvでpythonのバージョン管理、こちらのvenvでパッケージのバージョン管理、Docker等コンテナで作業する場合はそのDockerのPythonを使用していく。(修正 2022/1/27)

毎日1%ずつ改善していば、その改善は小さくて目に見えないかも知れないけれど先で大きな変化をもたらす、と言う興味深い視点に基づく習慣本。リフロー型なのでハイライトもし易い。
後9日は45%オフ(2022年1月25日現在で)、中古本だと1,200円程なのでお得。

コメント

タイトルとURLをコピーしました