現象
Pyenvで3.6.6をインストールしてそちらに切り替えてるのに、Pythonのバージョンが切り替わらない
$ pyenv versions
system
* 3.6.6
$ python --version
Python 2.7.12
しかし、Pytestから実行した場合は3.6.6が使われ、シェルから起動した場合は2.7になる
$ cat test_version.py
# 実行環境のPythonバージョンが3.6.6だったらOKとなる関数
def test_version():
import sys
assert sys.version_info == (3,6,6, 'final', 0)
$ pytest test_version.py -v
============================================================================================================ test session starts ============================================================================================================
platform linux -- Python 3.6.6, pytest-3.8.0, py-1.6.0, pluggy-0.7.1 -- /home/rock64/.pyenv/versions/3.6.6/envs/tdd/bin/python
cachedir: .pytest_cache
hypothesis profile 'default' -> database=DirectoryBasedExampleDatabase('/home/rock64/repositories/python-tdd/.hypothesis/examples')
rootdir: /home/rock64/repositories/python-tdd, inifile:
plugins: hypothesis-3.71.10
collected 1 item
test_version.py::test_version PASSED # OKとなっている [100%]
========================================================================================================= 1 passed in 0.06 seconds ==========================================================================================================
# 一方シェルから呼び出してみると2.7.12と出る
$ cat version.py
import sys
print(sys.version)
$ python version.py
2.7.12 (default, Dec 4 2017, 14:50:18)
[GCC 5.4.0 20160609]
???
(こういうふうに整理して書くとすでにモロバレな気はする…^^;)
調査
まずPyenvの設定が正しいのかを確認する。
$ vi ~/.bash_profile
...(略)...
# Pyenv設定
export PYENV_ROOT=${HOME}/.pyenv
export PATH=${PYENV_ROOT}/bin:${PATH}
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
大丈夫っぽい
次に実行ファイルの場所が正しく参照されているか確認
$ which python
/home/rock64/.pyenv/shims/python
これもシステムのpythonではなくPyenvの配下を指しているので問題なさそうだ。
この記事によると、
pyenvのバージョン選択はまず、pyenv shellで設定されるPYENV_VERSION環境変数。
次に、pyenv localで設定できる、カレントディレクトリにある.python-versionファイル。
次に、pyenv global で設定できる~/.pyenv/versionファイル。
全てがなかったらsystemのpython。
だそうだ。確認してみる。
$ printenv |grep PYENV_VERSION
# なし
環境変数には設定されていない。
$ cat .python-version
3.6.6
ローカルディレクトリに.python-version
があり、正しく設定されている。
うーん、環境がRock64というマイナーSBCだから、またCPUアーキ(aarch64)関係のバグかなー??などと人のせいにするモードに入っていたが。。。
結論
ここでふと気づいて、エイリアス設定がされているのではないか?と考えた。
$ cat ~/.bash_aliases
alias python='python2'
…
あったぁぁぁぁ!(棒)
そりゃどうやってもpython2で実行するわな。。。
原因
まあ本筋とは関係ないのですが、このようなエイリアスが設定されていた理由についても調べた。
通常エイリアスでpython3 -> pythonというふうに設定することはあっても、python2 -> pythonというパターンはあまり考えにくいと(個人的には)思っていたので、気づくのに遅れたというのもある。
ファイルの更新履歴を ls -aucl
などとして調べると、今年(2018)の8月となっていた。
何やったっけと思い、ツイートをあさってみると
Rustをインストールしようとしてなんじゃこのアーキ(aarch64)って怒られたのでソースからビルドしようと思ってdependenciesにPython2.7(3.xではなく)があってエイリアスで切り替えるのも面倒だからanaconda入れようとしてダウンロードサイズデカイなってなってよくみたらもうpyenv入ってたのでニッコリ
— Umu (@Umu999_0YOtJHCt) August 8, 2018
やはりエイリアスが妥当だった(後悔)
— Umu (@Umu999_0YOtJHCt) August 8, 2018
ばっちりエイリアス設定して回避したと書いてあった。。。
横着せずにPyenv使っとけって話ですね。