venvで作成した仮想環境内のPythonバージョンを変更したい

作成済みのvenv仮想環境上のPythonバージョンを変更したい場合にどうすればよいか確認をしてみました。
2020.03.23

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

pipによるライブラリのインストール状態をディレクトリごとに独立させたい場合は、venvを利用するのが便利です。

このvenvで作成した仮想環境上のPythonバージョンは、環境作成時のローカルのPythonバージョンで基本的に固定されます。今回はこの作成済みのvenv仮想環境上のPythonバージョンを変更したい場合にどうすればよいかを確認してみました。

確認してみた

まず、venvで作成した仮想環境上のPythonバージョンが、冒頭で述べたように環境作成時のローカルのバージョンで固定されることを確認してみます。

ローカル環境のPythonバージョンは3.7.2です。

$ pyenv versions
  system
* 3.7.2 (set by /home/ec2-user/.pyenv/version)
  3.8.0
$ python -V
Python 3.7.2

この状態でpython -m venv [venvディレクトリ]により仮想環境を作成すると、作成された環境内のPythonバージョンは作成時のローカルのバージョンと同じ3.7.2となります。

$ python -m venv .venv
$ . .venv/bin/activate
(.venv) $ python -V
Python 3.7.2

このとき、ローカル環境のPythonバージョンをpyenvで3.8.0に切り替えてみます。

(.venv) $ deactivate
$ pyenv global 3.8.0

3.8.0に切り替わりました。

$ pyenv versions
  system
  3.7.2
* 3.8.0 (set by /home/ec2-user/.pyenv/version)
$ python -V
Python 3.8.0

この状態で、先程作成したvenv環境をもう一度有効化すると、Pythonバージョンは3.7.2のまま変わっていません。環境作成時のローカルのPythonバージョン3.7.2で仮想環境内のバージョンが固定されていることが確認できました。

$ . .venv/bin/activate
(.venv) $ python -V
Python 3.7.2

この固定されたPythonバージョンを変更するにはどうすればよいかというと、結論としては、仮想環境内のPythonバージョンを切り替えるためには、venvの--clearオプションを利用して仮想環境を一度クリアする必要があります。

実際にやってみます。ローカル環境でpython -m venv [venvディレクトリ] --clearを実行し、作成済みの仮想環境をクリアします。

(.venv) $ deactivate
$ python -V
Python 3.8.0
$ python -m venv .venv --clear

そして、クリアした仮想環境上のPythonバージョンを確認すると、ちゃんと3.8.0に切り替わっていました。

$ . .venv/bin/activate
(.venv) ec2-user:~/environment $ python -V
Python 3.8.0

まとめ

venvで作成した仮想環境上のPythonバージョンを変更したい場合は、

  • ローカル環境のPythonバージョンを仮想環境で利用したいバージョンに切り替える。
  • python -m venv [venvディレクトリ] --clearで仮想環境をクリアする。

とすればOK。

注意点としてclear前にvenv環境にpip installしていたモジュールはクリアされるので、インストールし直す必要があります。

おわりに

別の方法として仮想環境内でPythonをアップグレードする手もあると思いましたが、ローカル環境でpyenvを利用しているなら今回の方法が便利なのではと思います。

参考