2021年のPython仮想環境〜いまやvenvを使わない理由はありません〜

Python仮想環境、どうしていますか？

さまざまなライブラリがあるのがPythonの魅力の1つですが、それゆえ、ライブラリ互換性や安定性を考えると、開発目的にあわせたライブラリセットとPythonバージョンを組み合わせて、必要に応じて、切り替えたいものです。それを実現するのがPython仮想環境です。

Python仮想環境については、いろいろな選択肢がありますが、よほどのコダワリが無いのであれば、**venvの選択を強くお勧めします**。理由を3つにまとめてみました。

> 仮想環境の比較紹介については、「[pyenv、pyenv-virtualenv、venv、Anaconda、Pipenv。私はPipenvを使う。](https://qiita.com/KRiver1/items/c1788e616b77a9bad4dd)」が、非常によくまとまっています。ただし、venvはPythonインタプリタバージョンの切り替えはできない、という分類がされていますが間違いです。venvはvirtualenvとほぼ同等なのは書かれている通りです。ですので、○の位置もvirtualenvと同等であるべきで、Pythonインタプリタバージョンの切り替えは可能です。仮想環境ごとに別バージョンの利用ができるものの、同じ仮想環境のバージョンを後から切り替えることはできないところも、virtualenvと同等です（アップグレードはできます）。

> なお、比較対象の1つであるAnacondaは、2020年より一部の商用利用は有償化されましたので、ますます本稿の主張が強められています。

# 理由1. Python仮想環境でありつつ、公式だから

当たり前ですが、venvはPython3.5以降のPython公式に付属する推奨仮想環境です。

[Effective Python 第2版](https://www.amazon.co.jp/dp/4873119170)でも、項目83番目でvenvの利用を推奨しています。

venv非対応なPython3.4のサポートが2019年4月に完了し、Python2系のサポートが2020年１月1日に終了して実際の最終リリースが2020年4月となりました。これまでは「venvは公式だけど、自分の使いたいPythonバージョンには対応していない」と言われて、他のPython仮想環境を使う理由がありましたが、2021年においては否定的理由はなくなりました。**いまやvenvを使わない理由はありません**。

# 理由2. 公式系の関連エコシステムが充実しているから

資格試験・教育コース・企業系発信といった「公式系」のPythonエコシステムでは、前提とする仮想環境はvenvになってきています。

+ [Python3エンジニア認定基礎試験](https://www.pythonic-exam.com/material)の主教材である、オライリー・ジャパン「Pythonチュートリアル 第3版」では、仮想環境の項では公式の1世代前であるpyvenvが掲載されています。実は、この本は結構古く、最新版の「Pythonチュートリアル 第4版」では、記述がvenvに切り替わっています。認定試験としても早々に最新版対応する予定であることを表明しています。
+ 2020年から開始したCicso DevNet試験では、[Cisco DevNetのmacOS向け学習環境構築](https://changineer.info/devnet/devnet_preparation/devnet_preparation_mac_homebrew.html)に記載されているように、試験対策チュートリアルがvenv前提で記述されています。
+ [VSCodeのPython環境構築の公式チュートリアル](https://code.visualstudio.com/docs/python/python-tutorial)では、仮想環境としてvenvが説明されています。
+ 機械学習の定番ライブラリsklearnの[公式インストール説明](https://scikit-learn.org/stable/install.html)には、Note that in order to avoid potential conflicts with other packages it is strongly recommended to use a virtual environment (venv) or a conda environment.と記述があり、venvとanacondaだけを認めています。

数年前と異なり公式系のエコシステムが成長し、**いまやvenvを使わない理由はありません**。

なお、注意したいのは、ここQiitaをはじめとしたユーザ参加型コンテンツのような「非公式系」では、pyenvなどの他のPython仮想環境が優勢であることです。こういったユーザ参加型コンテンツでは、以前に流行った方式がなかなか下火にならない、という特性があります。古くても人気があったコンテンツは検索上位に来ますし、それを見た別の人が、新たにコンテンツを生成する、という循環が生まれるためです。よって、**現時点の2021年では、公式系のコンテンツではvenvが使われ、非公式系ではvenvはほとんど使われない、という歪んだ状態にあります**。

# 理由3. pipが使えるから

機械学習が流行った現在、さまざまなライブラリを追加インストールする機会が増えました。その際、ライブラリインストール例はpipで記述されています。また、機械学習の流行により、Juypterを使った例が非常に増えました。Jupyterでも!pipで追加ライブラリのインストールをさせるサンプルコードが多いです。すなわち、pipを使うように誘導される機会が、非常に増えています。

> Jupyterでのpipによるライブラリ追加インストールは、Jupyterを立ち上げた環境に作用します。そのため、**Jupyerはvenv環境から立ち上げるべき**であり、かつ、別ライブラリセットを使いたいJupyterはベースとなるvenv環境も分けるべきです。この事実はあまり認識されていないようです。

一方、anacondaユーザがこれらのサンプルコードをそのまま実行して、**anaconda（の上のJupyter）にpipでパッケージインストールして、システムを不安定にさせる、という事故が頻発**しています（[teratail](https://teratail.com/)でのQA動向の感覚値に基づきます）。

venvはもちろんpipをそのまま使えますので、このような問題もありません。pipを使う機会が増えた中、**いまやvenvを使わない理由はありません**。

# おまけ. 3つの理由を満足するさらなる仮想環境

実は、これら3つの理由を満足する仮想環境が、まだ存在します。厳密に言うと、「Python仮想環境」ではありません。そのため、理由1は命題として真になります。なぜなら、前提条件である「Python仮想環境でありつつ」が命題として偽なので、「Python仮想環境でありつつ、公式だから」は、公式かどうかにかかわらず真になるためです。（やや苦しい笑）

1つは、Dockerです。Docker上で生Pythonを実行させ、コンテナ環境ごと切り替えて使うというやり方です。なお書籍「[自走プログラマー](https://nakorake.hatenablog.com/entry/2020/10/18/100840)」では、プロが選択する仮想環境としては、venvかDockerである、と言い切っています。

もう1つは、Google Colabです。Jupyter+Ubuntu+VMをクラウド提供するセットです。機械学習に使えるライブラリはプレインストールされており、さらに追加ライブラリをpipでインストールすることが可能です。好みは分かれますが、追加ライブラリ等の環境は、VMの最大利用時間をすぎるとリセットされますので、あたかも仮想環境のように使えます。Google Colabが前提環境となっている教育コースが増えています。

いずれにしても、**「Python仮想環境には、いまやvenvを使わない理由はありません」は、命題として真**なのです。