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
./
付けるクセ付ければいいし。あくまで自分のメモなんで、、、 ゴニョゴニョ…