python環境(pyenv + direnv)

(最近はpyenv + direnv ではなく pipenv + direnv (layout pipenv)を使用。poetryやpyflowは様子見中)

pyenv嫌われな記事があったりするけど、pythonのバージョンいろいろ使うならpyenvがやっぱり便利と思う。環境切り替えとしてanacondaは使ったことないです。

主に pyenv + direnv な構成にしてます。macOSだとhomebrewのpyenv-virtualenvのままにしている環境もあります。
最近zshへ移行中だけれどサーバセットアップ前提のためbashで。

pyenv

いろんなpythonをビルドでき、簡単に切り替えられる。

pyenv導入

CentOSでやるイメージで。まず導入。バージョンによって-devは-develかも。

sudo dnf group install -y "Development Tools" zlib-dev bzip2-dev sqlite-dev openssl-dev readline-dev
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init -)"\nfi' >> ~/.bash_profile
exec "$SHELL" -l

pyenvでpythonをインストール

好きなpythonをインストール。(3.8.1)

pyenv install -l
pyenv install 3.8.1
pyenv versions

direnv を使わないのであれば、 pyenv local 3.8.1 として切り替え。 .python_version が生成されて、以降、ディレクトリに入ると自動切り替え。

pyenv + venv (使っていない)

pyenvでpythonのバージョンは切り替えられるが、プロジェクト毎にlibなどを分けることはできない。venvはpython3で virtualenvが標準機能になったもの。名前がvenvだとどのvenv環境にいるのか切り替わってるかわからないのでプロジェクト名で作成。

cd prjDir
pyenv local 3.8.1  # 初回のみ
python -m venv prjName
#python -m venv --clear prjName  # 初期化する場合。rmしてもいいけど。

prjName ディレクトリが出来る。切り替えは prjName/bin/activate 戻す時は deactivate を実行。つくるのも面倒くさいが切り替えはさらに面倒臭い。

pyenv + direnv

pyenvのpythonバージョンを使用して.direnvディレクトリ下で環境を分ける(direnvが.direnv下にvenvを作ってくれる)。direnv は環境変数などを自動切り替えできて超便利。 バイナリインストール じゃない場合、go製なのでgoでビルド。導入。

direnv導入(コンパイル)

sudo dnf install -y go go-md2man
git clone https://github.com/direnv/direnv
cd direnv
sudo make install
echo 'export EDITOR=vim' >> ~/.bash_profile
echo -e 'if command -v direnv 1>/dev/null 2>&1; then\n  eval "$(direnv hook bash)"\nfi' >> ~/.bash_profile
exec "$SHELL" -l

pyenv + direnvでpythonと環境を切り替え

direnvを使ってプロジェクトディレクトリに出入りした時に自動でpyenvのpython versionと環境を切り替え( .python-version は不要。venvもdirenvが自動実行)。

cd prjDir
direnv edit .
+layout pyenv 3.8.1
direnv allow

.envrc ファイルと .direnv ディレクトリが生成され、以降、prjDirに入ればpyenvのpythonバージョンと$VIRTUAL_ENVが自動で切り替わり、抜けると元に戻る。

pyenv + direnv の良いところ

.envrc 1行だけの設定で、ディレクトリ出入りでpython versionと環境が切り替えられる (pyenv localやvenvの手動設定不要) !

# 手順おさらい
# prjAでpython 3.8.1を使う(未インストール)
pyenv install 3.8.1
mkdir ~/prjA;cd ~/prjA
direnv edit .
+layout pyenv 3.8.1
direnv allow
# prjBでも3.8.1を使う
mkdir ~/prjB;cd ~/prjB
direnv edit .
+layout pyenv 3.8.1
direnv allow
# prjCではpython 3.7.5を使う(未インストール)
pyenv install 3.7.5
mkdir ~/prjC;cd ~/prjC
direnv edit .
+layout pyenv 3.7.5
direnv allow

appendix

他のpython環境ツールでも direnv 便利。https://github.com/direnv/direnv/wiki/Python
詳しくは stdlib.sh をみると良し。Rubyとか他の言語でも。(env系の発祥はrbenvだとか)

dockerで環境分けるという手も…。

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください