環境
> 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の違いをちゃんと理解しないと痛い目にあう