LoginSignup
0
1

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-09-21

現象

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使っとけって話ですね。

0
1
0

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
  3. You can use dark theme
What you can do with signing up
0
1