(最近は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で環境分けるという手も…。