はじめに
Python+Djangoで開発をしているのですが、複数案件を担当していると案件によってPythonやDjangoやその他のライブラリのバージョンが異なります。
場合によっては、同じPythonのバージョンでも異なるライブラリのバージョンが異なるため、pyenvとvenvによるバージョン管理は非常に役に立ちっています。今回は必要最小限の機能に絞って利用方法を記載してみます。
実行環境
OS:macOS Big Sur(version 11.2.2)
シェル:zsh
or
OS:CentOS7
シェル:bash
pyenv
pyenvを利用することで様々なバージョンのPythonを利用することが可能になります。
本記事の記載時点だと2.1.3~3.9.1までインストール可能です。
pyenvのインストール
macの場合はHomebrewを利用してインストールできるようです。
$ brew install pyenv
Linuxの方などはgitで持ってくることができます。
$ git clone git://github.com/yyuu/pyenv.git ~/.pyenv
シェルの設定ファイル編集
自身のログインシェルをecho $SHELL
で確認しておきます。
zsh→.zshrc(.zsh_profile)
bash→.bash_profile
に以下を記載しています。vimで直接記載しても良いですが今回は簡略化のためにecho
を利用します。
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
$ echo 'eval "$(pyenv init -)"' >> ~/.zshrc
最後に設定ファイル反映を反映します。
$ source .zshrc #bashの方は .bash_profile
pyenvで必要なバージョンのPythonをインストール
これまでの設定でpyenvが利用できるため、利用可能なPythonのバージョンを調べます。
$ pyenv install --list
○.○.○とリストに表示されるものがインストール可能です。
利用したいバージョンのpyenvをインストールします。
$ pyenv install 3.9.1 # 今回は3.9.1をインストール
pyenvのバージョン切替
現在のバージョンを調べます。
$ pyenv versions
systemとインストールされたバージョンが表示されます。
「*」の横に記載のバージョンが現在のディレクトリで利用されるものです。
* system (set by /○○/○○.pyenv/version)
3.9.1
利用するPythonのバージョンを切替します。
ディレクトリに応じて細かく分けたりもできますが、venvの利用が主目的のため今回は割愛。
$ pyenv global 3.9.1
もう一度pyenv versions
で確認するとデフォルトバージョンが切り替わっています。(Pythonをインタプリタで起動しても確認できます)
system
* 3.9.1 (set by /○○/○○.pyenv/version)
これで利用したいバージョンでvenv仮想環境を作成する準備が整いました。
venv環境の作成
venvはPython3系ではデフォルトで利用可能なので特にインストールなどは必要ありません(2系を利用されている場合はvirtualenvのインストールすることで似たようなバージョン管理が可能になります)。
仮想環境を作成したいディレクトリで以下を実行します。
$ python -m venv venv_project #venv_projectは任意のプロジェクト名
配下にvenv_projectディレクトリができるのでcd venv_project
で移動し、仮想環境をアクティベート。
$ source bin/activate
実行に成功するとホスト名の前に表示されます。これで仮想環境にはいっています。
(venv_project)hostname$
仮想環境をアクティベートすることで、これからpipでインストールするライブラリはローカルの環境から分離して独立して管理することが可能です。
あとは自由に必要なバージョンのライブラリをインストールして利用してください。
最後にローカルに環境に戻る際はアクティベートを解除します。
$ deactivate # プロジェクトディレクトリ配下でなくても実行可能
以上で最低限のpythonでのバージョン管理ができそうです。
さいごに
pyenvもvenvもちゃんと理解すればもっと便利に利用できそう。
ただ、今回の手順を踏めばローカル環境は元の状態を保てるためバージョンでの衝突は防げるのではないかと思います。
どなたかの参考になりましたら幸いです。