search
LoginSignup
1

More than 3 years have passed since last update.

posted at

updated at

PyenvでどうしてもPythonバージョンが切り替わらなかった話

現象

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月となっていた。
何やったっけと思い、ツイートをあさってみると

ばっちりエイリアス設定して回避したと書いてあった。。。
横着せずにPyenv使っとけって話ですね。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
1