LoginSignup
1
4

More than 5 years have passed since last update.

pyenv+pyenv-virtualenv環境で自動でvirtualenv環境を読み込む

Last updated at Posted at 2017-09-16

やりたいこと

pythonをpyenv + pyenv-virtualenv環境で利用している方向けです。
ディレクトリを移動した際に自動で.python-versionを読み込みactivateしたい。

理由は、

cd ~/foo
pyenv activate foo

cd ~
pyenv deactivate

とactivateとdeactivateをいちいち行うのがめんどうくさため。

direnvを利用していればeval "$(direnv hook bash)"
~/.bashrcなどに下記の通り記載していればcdするごとに
hookしてくれているみたいなので、direnvを利用しなくてもできるはず。
少し調べてやってみれば簡単にできたので、備忘も兼ねて久々に投稿
direnv使えばいいのかもしれないけど、個人的になんかなじめなかった)

訂正:
eval "$(pyenv virtualenv-init -)"
と、~/.bash_profileに記載されていれば自動で切り替わる...
上記、記載していたつもりであるが、記載位置が悪かったのか環境が切り替わらなかったことがあった...

設定

pyenvpyenv-virtualenv環境の設定がされていることを前提としています。
その上で.bash_profileなどに下記を.bash_profileに追記してください

cd(){
    now_path=`pwd`
    now_pyenv_filepath=$now_path/.python-version
    if [ -e ${now_pyenv_filepath} ];then
        now_pyenv=`cat ${now_pyenv_filepath}`
        pyenv deactivate
    fi

    new_pyenv_filepath=$1/.python-version

    if [ -e ${new_pyenv_filepath} ];then
        local_env=`cat ${new_pyenv_filepath}`
        pyenv activate ${local_env}
    fi

    builtin cd "$1"
}

上記を記載した上で、source .bash_profileと読み込みなおせば
自動でdeactivateactivateしてくれます。

一番最初に現在の場所をpwdで読み込み
そこに.python-versionがあればdeactivateするのが前半部分

さらに移動先のフォルダに.python-versionがあれば
それを読み込みactivateし、最後にビルトインされているcdを読み込み
移動をしています。

bulitin hoge でビルトインされているコマンド呼び出せるのしらんかった。

参考

shell hookとかでぐぐった下記を参考にしました。
- https://unix.stackexchange.com/questions/170279/can-i-hook-into-the-cd-command

1
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
4