pyenvのバグ??
バグかどうかわからんけど、思った通りの動作をしなかったので、メモ。
pyenv を使う環境で、
python script.py --option /path/to/file
と実行した場合、カレントディレクトリと/path/to/fileの存在するディレクトリで使用するpythonのバージョンが異なる場合、
(どちらか片方 or 両方で pyenv localが指定されている)
カレントディレクトリではなく、/path/to/fileの存在するディレクトリで使用するpythonのバージョンが指定されてしまうらしい。
問題が発生するシチュエーションは そんなに多くないと思うけど、 双方のバージョンでインストールしてるモジュールが違ったりすると困ったことになる。
色々試行錯誤してみてわかったことを結論だけ。
~~~/.pyenv/shims/python を見ると、
コマンドラインをサーチして最初に見つかったファイルの属する.python-versionを読むらしい。
(以下の部分)
・・・
case "$arg" in
-c* | -- ) break ;;
*/* )
if [ -f "$arg" ]; then
export PYENV_FILE_ARG="$arg"
break
fi
;;
esac
・・・
本来ならスクリプトファイルのあるディレクトリの.python-versionを読んでほしいはずなのに…
*/* ) でなく、*) じゃないのかな? なんか深い訳があるのかもしれんけど…
で、以下のいずれかの方法で対処できる。
=にする
python script.py --option=/path/to/file
argparse.ArgumentParserなど、オプションとオプションパラメータの区切りに=が使えるものでなければダメ。pyenv shellで使用するバージョンを指定する
--を追加してやる。
python -- script.py /path/to/file
~~~/.pyenv/shims/python では-cか--が見つかったらPYENV_FILE_ARGを探すループを抜けてくれるので。python ./script.py /path/to/file
./付けるクセ付ければいいし。あくまで自分のメモなんで、、、 ゴニョゴニョ…