仮想環境というもの自体への理解がいまひとつ足りていないので、併せてお教えいただければと思います。
というご質問への回答です。
Pythonは変化がはやい
Pythonは年に一回ぐらい大きなバージョンアップがあります。たとえば、Python 3.8.0は2019年10月14日にリリースされ、Python 3.9.0は2020年10月5日にリリースされました。
Pythonは2月に一回ぐらい小さなバージョンアップがあります。たとえば、Python3.9.4は2021年4月2日にリリースされ、Python3.9.5は2021年5月3日にリリースされました。
Python2とPython3
Python3をPython2の後継として開発されたのかもしれませんが、Python2との互換性はありません。2to3というモジュールがあってPython2用のコードをPython3用に変換できることになっていますが、あまり役に立ちません。Python2とPython3は別の言語だと考えておいた方が良いでしょう。
Python2は2020年4月20日以降アップデートが停止していますので、今Pythonのアプリを開発するならPython3を使いましょう。
ただし、Python2はOSの機能を実現していたりするのでOSに入っているPython2は決して削除しないでください。
ライブラリはPythonの変化に完全には追従できない
そしてPythonには山のようにライブラリ(NumPyとかSciPyとかTensorFlowとか)があります。ライブラリが全てのバージョンのPythonに対応するのには時間とコストがかかるので、対応できるバージョンが限られていることはよくあります。
その結果、あのライブラリを使いたければPython3.7以上でなければならない、このバージョンを使いたければPython3.4以上3.6いかでなければならない、なんていうことは良く起こります。(同じバージョンのPythonの上で複数バージョンの同じライブラリを使いたいという話もありますが複雑になるので割愛します)
Pythonのライブラリは個々のPythonに入れなければならない
Pythonのライブラリのバージョンは相互に依存関係があります。例えばScipyのこのバージョンを使うにはNumpyはこういう範囲のバージョンでなければならない、というような話です。それやこれやの理由で、Pythonの処理系はそれぞれにライブラリを持っています。そして複数のPythonがライブラリを共用することはできません。無理にやれば出来る場合もありますが、たいていは次のアップデートで破綻します。
ユーザは多くのPythonをインストールする。
その結果、各ユーザのストレージには複数のバージョンのPythonがインストールされ、インストールパスを切り替えたりして使うのが大変になりました。
仮想環境とは
この問題への対応として複数のPythonのバージョンを切り替える機能を実現するコマンドなどが開発されました。そういう機能のことを仮想環境と呼んでいるようです。conda、pyenvなどです。
Pythonのモジュールであるvenvというのもありますが、これはPythonのモジュールですのでPythonのバージョンを切り替えることは多分できないのだと思います。つまり、割愛した「同じバージョンのPythonの上で複数バージョンの同じライブラリを使いたい」の対応するための機能なのでしょう。
仮想環境は原則として仮想環境の中でインストールしたPythonを切り替えます。従って仮想環境の外でインストールしたPythonのことは関知しません。
仮想環境がさらに問題を複雑化する
Pythonのバージョンを確認して同じなのにインストールしたモジュールをimportできないという質問がときどきあります。しかし、一台のコンピュータの中に同じバージョンのPythonが複数インストールされていることも良くあります。それぞれの仮想環境はその中でバージョンを管理していますので、仮想環境の外に全く同じバージョンのPythonがインストールされていることもあります。
この場合、Pythonのバージョンは同じだけれども、インストールされているモジュールは違っているということも起こります。
どうすればいいのか
仮想環境を一つ決めて、(OS同梱のPythonを除く)それ以外のPythonを全て削除するのも一つの方法です。
あるいは、どこにあるPythonが動いているかを常に確認しておくのも一つの方法です。
確認するためには以下を実行しましょう。
python
1import sys
2print(sys.executable)