仮想環境とは?
基本的にPython開発では開発PCの中に仮想的な開発環境を構築し、仮想環境上で開発を行います。
この仮想環境は1台のPCに複数構築することが可能で、成果物などに応じて切り替えて使用します。

なぜ仮想環境が必要なのか
まず仮想環境を使用するうえで一番直感的に理解しやすいパターンから考えていきましょう。
複数プロジェクトに携わる例
例としてDeveloper Bが複数のプロジェクト開発に携わっている場合について考えます。

どちらのプロジェクトでもLibrary Aを使用した開発となっていますが、バージョンが違いますね。
両方ともDeveloper Bが開発を行いますが、プロジェクトごとにPCを分けられるような贅沢な環境ならまだしも、一般的には1台のPCで開発することが求められます。
このような場合に仮想環境を使うことで上手いことできるようになります。

1. 開発PCにProject_Aという仮想環境を構築する。
2. 仮想環境Project_Aに対してLibrary A ver1.0をインストールする。
3. 開発PCにProject_Bという仮想環境を構築する。
4. 仮想環境Project_Bに対してLibrary A ver2.0をインストールする。
それぞれの仮想環境は独立していますから、お互いのプロジェクトに対して影響しあうことなく開発ができるようになりました。
ではこのようなパターンでしか仮想環境を使わないのか?と言われるとそうではありません。
Pythonを使った開発では基本的に仮想環境を構築するものと考えてください。
仮想環境を構築する必要性について
仮想環境を構築するメリットは大きく分けて以下の3つにあると考えています。
- 複数プロジェクトを管理しやすい
- 目的に対して必要最低限のライブラリに限定することができる
- 開発環境を複数人で共有しやすい
上記1に関しては先ほど例に挙げたものですね。
以降のメリットには、依存ライブラリというものが関係してきます。
必要最低限のライブラリに限定
1つのライブラリをインストールする場合でも複数の依存ライブラリも併せてインストールされるわけですが、仮想環境を使用せず同じ開発環境をずっと使い続けた場合はどうなるでしょうか。

上記例の場合、Application Cに必要なのはLibrary Cのみですが他のアプリ開発時に使用したライブラリも混在している状態になっていますね。
不要なライブラリが多いと依存ライブラリの競合によるエラーが発生する可能性も上がります。
ライブラリ同士が邪魔をし合って意図した挙動とは異なる動きをするためです。
例えば以下の例の場合、Library BはLibrary Aのver 1.0に依存しており、
Library CはLibrary Aのver 2.0に依存している状態です。
このLibrary BとLibrary Cの両方が開発環境に入っており、Library Bを使いたい場合について考えます。
Library Bが依存している処理がfunc Aの場合はver 2.0でも修正されていないため特に問題はありませんが、func Bの処理に依存している場合はver 2.0で更新されているため正常に動作しない可能性がありますよね。
ver 1.0のfunc Bの挙動を前提としてLibrary Bが作られているのに、Library Cがあるせいでver 2.0が採用されていたりでもしたら自分が書いたソースコードに異常がないのにLibrary B側でエラーになったりするわけです。
きちんと仮想環境を構築した場合でもライブラリの相性によっては事態が避けられないこともありますが、Library Cが成果物に不要なものであった場合、無意味な事故を招くことになります。
もちろん1つの開発環境を使いまわす際に開発環境をリセットするのであれば、この点においては仮想環境を構築しているのと変わりませんからそれでも問題ありませんが、依存ライブラリも含めて正確にリセットする手間を考えれば仮想環境を作ってしまったほうが遥かに楽で事故も少ないですよね。
複数人で開発環境を共有
仮想環境用のツールではインストール済みのライブラリを外部ファイルに出力する機能と、外部ファイルを元にライブラリをインストールする機能が用意されています。
そのため開発者が複数人いる場合に、先行して環境構築を行った人の仮想環境と同じ環境を他の開発者にも簡単に提供できるというわけです。
さいごに
今回は仮想環境の必要意義について私なりの解釈を図説多めで語ってみました。
最後までご覧いただきありがとうございました。
