環境
> sw_vers
ProductName: Mac OS X
ProductVersion: 10.14
BuildVersion: 18A391
> pyenv --version
pyenv 1.2.9
> pyenv which python
/Users/username/.pyenv/versions/3.7.1/bin/python
問題
poetry shell
したはずなのに、.venv
内のpython
が実行されない
> poetry shell
> which python
/Users/username/.pyenv/shims/python
原因
printenvの結果を見てみると以下のようになっていた
...
/Users/username/.pyenv/shims
/Users/username/.ghq/github.com/username/sample/.venv/bin
...
あれ....venv
よりも前に.pyenv
が来てる...なんでだ...
~/.bashrc
に書かれているeval $(pyenv init -)
が悪さをしているのかも?
「そういえば、~/.bashrc
にeval $(pyenv init -)
って記述してるんだった」
「そもそも、pyenv init -
ってなんだ!?」
「とりあえず、実行してみるか」
> pyenv init -
export PATH="/Users/username/.pyenv/shims:${PATH}"
export PYENV_SHELL=bash
source '/usr/local/Cellar/pyenv/1.2.9/libexec/../completions/pyenv.bash'
command pyenv rehash 2>/dev/null
pyenv() {
local command
command="${1:-}"
if [ "$#" -gt 0 ]; then
shift
fi
case "$command" in
activate|deactivate|rehash|shell)
eval "$(pyenv "sh-$command" "$@")";;
*)
command pyenv "$command" "$@";;
esac
}
「/Users/username/.pyenv/shims
を前に持ってきてる!?」
「これのせいか!」
解決方法
eval $(pyenv init -)
は~/.bashrc
ではなく、~/.bash_profile
に書く
それぞれのファイルは以下のように読み込むタイミングが異なる
-
~/.bash_profile
はログイン毎に読み込まれる -
~/.bashrc
はbashを起動する毎に読み込まれる
PoetryのIssuesにeval $(pyenv init -)
は~/.bashrc
ではなく、~/.bash_profile
に書けばいいんじゃない?ってコメントがあった
なるほど!~/.bashrc
に書いていたから、poetry shell
したときにeval $(pyenv init -)
が実行されてしまい、うまく.venv
内のpython
が実行されなかったのかも!
eval $(pyenv init -)
を~/.bash_profile
に書き写して、poetry shell
を実行
> poetry shell
> which python
/Users/username/.ghq/github.com/username/sample/.venv/bin/python
ちゃんと.venv
の中のpython
を見に行ってる!!!
めでたしめでたし!
まとめ
~/.bashrc
と~/.bash_profile
の違いをちゃんと理解しないと痛い目にあう