過去に、Anacondaに頼らない、pipとvenvを用いたPython環境の構築 という記事を書きました。今回、改めて、Pythonの仮想環境について理解が深まったので書きたいと思います。
仮想環境を構築したい背景
- Python は、ひとつのシステムに様々なバージョンが存在しえます。macOSでの場合を、macOS の Python事情を理解するに解説しました。LinuxやWindowsも同じで複数のバージョンが存在しえます。
-
また、LinuxやmacOSにおいて、Pythonは、システムの重要なところを担っていたりします。Ubuntuであれば、
dpkg -l | grep python3
とすると、どれだけ多くの Python3に関連したパッケージがシステムにインストールされているかを確認することができます。 -
このような状況において、システムのPythonに追加でパッケージを入れていって、もし不具合が起きた場合、システムそのものが不安定になる可能性があります。
-
Pythonの仮想環境を使うと、システムの中に、独立したPythonの環境を構築することができます。「独立している」というのは、システムに一切影響を与えないということを意味します。不要になったらばっさり削除しても一切問題ありません。
-
そこで、以下で、仮想環境の構築の仕方を解説します
仮想環境の構築の方法
1. どのPythonをベースにするかを決定
- Pythonの仮想環境を作るためには、まずは、どのPythonをベースにするかを決定する必要があります。ここでは、
/usr/bin/python3
をベースにすることにします。特定のバージョンのPythonを使いたい場合などは、どれを使うか決めておきます。
2. (該当する場合) Anaconda を 無効化 (deactivate) する
-
Anaconda が入っている場合、ターミナルを起動すると、最初に
(base)
と表示されます。Anacondaで使用しているPythonは仮想環境を利用しています。このため、コンフリクトを起こす可能性がありますので、無効化します。以下のコマンドで無効化できます。conda deactivate
3. 仮想環境をセットアップする
- 仮想環境は、ワーキングディレクトリの直下に自身で決めた名前でセットアップされます。今は、
~/virtual_python
の下にセットアップすることとします。 - ベースとすることに決定したPythonをフルパスで指定し、
venv
を使って仮想環境をセットアップします。今は、/usr/bin/python3
をベースにします。 - 仮想環境の名前は自由に決められます。プロジェクトX用のPythonということで、python-projectx という名前にします。
- これらをまとめると以下になります。
mkdir ~/virtual_python cd ~/virtual_python /usr/bin/python3 -m venv python-projectx
- そうすると、Pythonのコアの部分だけが、
python-projectx
の下にインストールされます。
4. 仮想環境を有効化 activate する
-
仮想環境は有効化してはじめて使えるようになります。仮想環境の下にある
bin/activate
をsource
コマンドを用いて実行します。pwd # ~/virtual_python source python-projectx/bin/activate
- そうすると、プロンプトの前に
(python-projectx)
となったはずです。
5. python3 と pip のパスの確認
-
これから必要なパッケージをインストールしますが、その前に、python3 と パッケージをインストールするコマンドである pip が仮想環境のものかどうか確認します。
command -v python3
command -v pip
で確認できます。command -v python3 ~/virtual_python/python-projectx/bin/python3 #実際は ~/ はホームディレクトリのフルパスが表示されます
command -v pip ~/virtual_python/python-projectx/bin/pip
- ともに仮想環境の中のものであることが確認できました。
6. パス変数の確認
-
上記、python3 と pip が仮想環境のものが呼び出されるということは、パスはどうなっているのでしょうか。パス変数を確認してみましょう。
echo $PATH ~/virtual_python/python-projectx/bin:/usr/local/freesurfer/7.4.1/bin(以下略)
- 今の仮想環境がPATH変数の一番最初に来ています。これが仮想環境の本質です。仮想環境を有効化することで、仮想環境の python3 がパス変数の一番最初に来ます。
7. pip のアップグレード
-
往々にして pip は古いバージョンであることが多いです。古いとパッケージのインストールができないことがありますので、以下でアップグレードします。
python3 -m pip install -U pip
8. インストールされているパッケージの一覧を表示
pip list
でインストールされているパッケージの一覧が表示されます。pip list Package Version ---------- ------- pip 23.3.2 setuptools 59.6.0
- 最初は pip と setuptools のみインストールされていることがわかります。
9. パッケージのインストール
-
必要なパッケージを pip でインストールできます。ここでは、DICOMを扱うためのパッケージ、pydicom をインストールします。
pip install pydicom
- “Successfully installed pydicom-2.4.4” と出れば成功です。
-
pip list で更新されているか確認してみます。
pip list Package Version ---------- ------- pip 23.3.2 pydicom 2.4.4 setuptools 59.6.0
10. パッケージのインストール場所
- 今インストールした pydicom は、
python-projectx/lib/python3.10/site-packages/pydicom
に入っています。python-projectx の下に入っているというのがポイントです。
11. 仮想環境の無効化
- 仮想環境の無効化は簡単です。
deactivate
とタイプするだけです。deactivate
- 仮想環境から抜けると、プロンプトの前にあった (python-projectx) がなくなります。
12. 無効化した後のパスの確認
-
仮想環境を無効化した後のパスを確認します。
echo $PATH /usr/local/freesurfer/7.4.1/bin:(以下略)
- 仮想環境のPythonのパスはなくなりました。
13. 仮想環境の削除
-
仮想環境の削除もとても簡単です。シンプルに、python-projectx をディレクトリごと削除すればOKです。
rm -r ~/virtual_python/python-projectx
(macOSのみ) macOSでの urllib3 に関する Warning
- macOSでは、いくつかのパッケージを入れたあと、プログラムを実行すると、以下のWarningが出ることがあります。
~/virtual_python/python-projectx/lib/python3.9/site-packages/urllib3/__init__.py:34: NotOpenSSLWarning: urllib3 v2 only supports OpenSSL 1.1.1+, currently the 'ssl' module is compiled with 'LibreSSL 2.8.3'. See: https://github.com/urllib3/urllib3/issues/3020 warnings.warn( WARNING: Nothing to be done - displaying usage help
- 「urllib3 は v2 から openssl 1.1.1 以上しか受け付けないよ」と言っています。
-
urllib3 のバージョンを以下で確認します
pip list urllib3 urllib3 2.1.0
- この urllib3 を バージョン 1.x にダウングレードします。入れられるバージョンを確認します。
pip install urllib3==
- これは、エラーになるものの、以下の表示がされます。
ERROR: Ignored the following yanked versions: 1.25, 1.25.1, 2.0.0, 2.0.1 ERROR: Could not find a version that satisfies the requirement urllib3== (from versions: 0.3, 1.0, 中略 1.26.16, 1.26.17, 1.26.18, 2.0.0a1, 中略, 2.0.6, 2.0.7, 2.1.0) ERROR: No matching distribution found for urllib3==
- これから、1.26.18 が 1.x 系の最新のバージョンとわかりますので、それを入れることにします。
pip install urllib3==1.26.18
- そうすると、1.26.18 が無事に入り、その後は、Warningは出なくなります。
いかがでしょうか。仮想環境は 有効化すると、自身のディレクトリを PATH 変数の最初に追加することで、その環境内のPythonを利用できるようになります。最初はパッケージが全く入っていない状況を作れますので、自分に必要なパッケージだけ入れた仮想環境を作ることで、きれいな環境を準備できますし、ベースとなるPythonを一致させ、仮想環境構築のためのスクリプトを共有することで、共同作業するスタッフと同様の環境を構築することも可能となります。
Pythonの仮想環境に対して相当理解が進みました。
大変有用な記事をまとめていただき、どうもありがとうございます。理解が進みました。次からは仮想環境を使って、pythonがこれ以上ややこしいことにならないようにしたいと思います(^^)
ありがとうございます!!