pyenv + pyenv-virtualとは
pyenvとは異なるプロジェクトごとに異なるバージョンのPythonを選択することが出来る仕組みです.pyenv-virtualはプロジェクトごとに利用するライブラリを分けて管理する仕組みです.
まずpyenv + pyenv-virtualの説明をするにあたって,pyenvやpyenv-virtualがない場合にどのような問題が生じるのかを説明します.
pyenvがない場合の問題点
pyenvがない状態では一つのマシンで単一のバージョンのPythonしか持つことが出来ません.そのため,Project Aでは3.10.5を使いたいが,Project Bでは古いバージョンの3.6.9を使いたい場合に問題が生じます.
この場合,一度3.10.5をアンインストールして,3.6.9をインストールしてProject Bの開発・保守を行い.Project Aの開発を行う時はまた3.6.9をアンインストールして3.10.5をインストールし直さないといけません.想像するだけで大変な作業です.
pyenvの問題点
pyenvを利用することで,一つのマシンに複数のバージョンのPythonを持てない問題を解消することが出来ます.
一方で,あるバージョンのPythonでは1セットのライブラリしか持てません.そのため,
- Project AとProject Bは両方ともバージョン3.10.5を利用する.
- Project Aではpandsとnumpyを使う.
- Project Bではrequestsとpytorchを使う.
上述のようなケースではライブラリ同士の衝突が生じて想定しない問題が発生するリスクが向上します.
pyenvの問題点を解消するpyenv-virtual
pyenv-virtualを利用することで,Pythonの仮想環境を構築することが可能です.そして,プロジェクトによって利用する仮想環境を選択することが出来ますので,ライブラリ間の衝突の可能性を軽減することが可能です.
pyenvのインストール
端末のプログラミング言語バージョン管理には,Pythonのバージョンを管理するpyenv以外にも,Javaを管理するjenv, rubyのバージョンを管理するrbenv等あります.これらの**envをまとめて管理するanyenvを使用する前提です.
pyenvのインストール
% anyenv update
% anyenv install pyenv
% exec $SHELL -l
pyenvでPythonをインストール
インストール可能なPythonのバージョンを確認する.
% pyenv install -l
pyenv-virtualenvのインストール.Available versions::と出た後にバージョンが一覧されます.バージョン名のみが記載されているものはCPythonです.その他は派生型のPythonのディストリビューションです.
Available versions:
2.1.3
2.2.3
2.3.7
2.4.0
~省略~
anaconda3-2021.11
anaconda3-2022.05
cinder-3.8-dev
graalpy-22.3.0
graalpython-20.1.0
graalpython-20.2.0
~省略~
stackless-3.4.2
stackless-3.4.7
stackless-3.5.4
stackless-3.7.5
例として2.7.15と3.7.0をインストールします.
% pyenv install 3.11.1
% pyenv install miniforge3-4.10.3-10
以下のコマンドを実行し,現在利用可能なPythonのバージョンを確認します.
% pyenv versions
* system (set by /Users/[username]/.anyenv/envs/pyenv/version)
3.11.1
miniforge3-4.10.3-10
システムで使用するデフォルトのバージョンを指定する
% pyenv global 3.11.1
% python --version
Python 3.11.1
今いるディレクトリ配下で使用したいバージョンを指定する
% cd xxx
% pyenv local miniforge3-4.10.3-10
% python --version
Python miniforge3-4.10.3-10
親ディレクトリに移動してPythonのバージョンを確認すると,globalで指定したバージョンになっていることが分かります.
cd ../
pyenv --version
Python 3.11.1
pyenv-virtualenvの導入
git clone https://github.com/pyenv/pyenv-virtualenv.git $(pyenv root)/plugins/pyenv-virtualenv
環境名testに対してPythonのバージョンminiforge3-4.10.3-10を利用する仮想環境を作成します.
pyenv virtualenv miniforge3-4.10.3-10 test
pyenv versionsで利用可能なバージョンを確認します.先程作成したばかりの環境名testと環境testとminiforge3-4.10.3-10の組み合わせminiforge3-4.10.3-10/envs/testが追加されました.
% pyenv versions
* system (set by /Users/[username]/.anyenv/envs/pyenv/version)
3.10.5
3.10.7
3.11.1
miniforge3-4.10.3-10
miniforge3-4.10.3-10/envs/test
test
新しくPythonプロジェクト用のディレクトリを作成します.
% mkdir test
% cd test
test
のディレクトリ配下で先程のtest環境名を使用するように指定します.Python 3.11.0
となっていますが,これはminiforge3-4.10.3-10
に対応するPythonのバージョンということになります.
% pyenv local test
% python --version
Python 3.11.0
pyenv versions
でも確認してみます.仮想環境test
が選択されています.
% pyenv versions
system
3.11.1
miniforge3-4.10.3-10
miniforge3-4.10.3-10/envs/test
* test (set by /Users/[username]/Development/test/.python-version)
virtualenvで作成した環境にpipでパッケージを追加してみます.
% pip install Flask
Package Version
------------ -------
click 8.1.3
Flask 2.2.2
itsdangerous 2.1.2
Jinja2 3.1.2
MarkupSafe 2.1.1
pip 22.3.1
setuptools 65.6.3
Werkzeug 2.2.2
wheel 0.38.4
もうひとつ仮想環境を作成してみます.
% cd ../
% pyenv virtualenv 3.11.1 test2
% pyenv versions
* system (set by /Users/[username]/Development/test/.python-version)
3.11.1
3.11.1/envs/test2
miniforge3-4.10.3-10
miniforge3-4.10.3-10/envs/test
test
test2
test
ディレクトリのプロジェクト配下で仮想環境test2
を使用するように変更します.
cd test
% pyenv local test2
バージョンを確認します.
% python --version
Python 3.11.1
% pyenv versions
system
3.11.1
3.11.1/envs/test2
miniforge3-4.10.3-10
miniforge3-4.10.3-10/envs/test
test
* test2 (set by /Users/[username]/Development/test/.python-version)
pipでインストール済のライブラリを確認します.pipとsetuptoolsのみがインストールされていることが分かります.
% pip list
Package Version
---------- -------
pip 22.3.1
setuptools 65.5.0
pyenv-virtualenvでインストールしたバージョン,作成した仮想環境はuninstallで削除できます.
pyenv uninstall miniforge3-4.10.3-10
pyenv uninstall test