📦

Visual Studio Codeでpyenv依存のvenvを使う

2024/05/25に公開

現状のバージョンはPython3.10.10を使用中。これをPython3.11.5以降のバージョンに変更したい。

でも、この環境はProgram FilesとAppdataとAnacondaとDocumentにPythonが入っている。

そんな人への備忘録。

目的

  • Pythonのバージョンを変更したい。
  • venvの起動でPythonのバージョンも切り替える。

参考

https://zenn.dev/sion_pn/articles/4418eeda7c62d0
https://qiita.com/probabilityhill/items/9a22f395a1e93206c846
https://qiita.com/ksato9700/items/e2356ea9c19c3ff8a467

実践

pyenvのインストール作業は上にあるZennの記事を読んでください。あっちのほうが分かりやすいです。

pyenv

今回はPython3.11.5をインストールする。
Pprogram FileもしくはAppDataにPythonが入っている人は後で対処を行う。

>pyenv install 3.11.5
:: [Info] ::  Mirror: https://www.python.org/ftp/python
:: [Downloading] ::  3.11.5 ...
:: [Downloading] ::  From https://www.python.org/ftp/python/3.11.5/python-3.11.5-amd64.exe
:: [Downloading] ::  To   C:\Users\<name>\.pyenv\pyenv-win\install_cache\python-3.11.5-amd64.exe
:: [Installing] ::  3.11.5 ...
:: [Info] :: completed! 3.11.5

Program FileもしくはAppDataに入っていたPythonはこの時点で使用ができなくなる。

>python -V
Python 3.10.10
** ここで3.11.5をインストール **
>python -V
No global/local python version has been set yet. Please set the global/local version by typing:
pyenv global 3.7.4
pyenv local 3.7.4

そのため、Python3.10.10の中身が入っているC:\Program Files\Python310C:\Users\name>\AppData\Roaming\Python\Python310を削除する。この環境ではAppDataを使用していたようだ。
ちなみに直接の移動はできなかった。どこかにPathの設定がありそうだが。
また、ここでAppDataのPythonを削除しないと後々面倒くさいことになる。
次に移動させたPythonのバージョンでグローバル化する。

>pyenv global 3.10.10
>pyenv versions
* 3.10.10 (set by C:\Users\<name>\.pyenv\pyenv-win\version)
  3.11.5
>python -V
Python 3.10.10

*が付いているバージョンが現在使用しているPythonとなる。
ちなみに、3.10.10はフォルダーの名前を参照しているようで、Python310のまま移動させた場合、このような表記となる。

>pyenv global Python310

フォルダー名だけ変えれば、これだけでもpipの管理を行えそうではある。
なお、Program FilesおよびAppDataを削除しないままpipを使うと下のようになる。Pyhtonが二つ入っていると気づいたのはこれ。

>pip show pip
Fatal error in launcher: Unable to create process using '"C:\Program Files\Python310\python.exe"  "C:\Users\<name>\AppData\Roaming\Python\Python310\Scripts\pip.exe" show pip ': ??????????????????

インストールされているpipの場所を確認する。

>pyenv global 3.10.10
>pip show pip
Name: pip
Version: 24.0
Summary: The PyPA recommended tool for installing Python packages.
Home-page:
Author:
Author-email: The pip developers <distutils-sig@python.org>
License: MIT
Location: c:\users\<name>\.pyenv\pyenv-win\versions\3.10.10\lib\site-packages
Requires:
Required-by:

>pyenv global 3.11.5
>pip show pip
Name: pip
Version: 24.0
Summary: The PyPA recommended tool for installing Python packages.
Home-page:
Author:
Author-email: The pip developers <distutils-sig@python.org>
License: MIT
Location: C:\Users\<name>\.pyenv\pyenv-win\versions\3.11.5\Lib\site-packages
Requires:
Required-by:

ここでLocation:c:\users\<name>\appdata\roaming\python\python310\site-packagesとなっているなら、Appdataにpipがあり、そこにインストールされる可能性があるため注意。
(Program FilesのときはAppdataに入ったので大丈夫だとは思うが。というより、この状態で下のインストールをやったけど問題はなかった)
pipをインストールすると環境ごとに変化するか確認。

>pyenv global 3.10.10
>python -V
Python 3.10.10
>pip list
Package    Version
---------- -------
pip        23.1.2
setuptools 65.5.0
>pip install tqdm
>pip list
Package    Version
---------- -------
colorama   0.4.6
pip        24.0
setuptools 65.5.0
tqdm       4.66.4

>pyenv global 3.11.5
>python -V
Python 3.11.5
>pip list
Package    Version
---------- -------
pip        23.1.2
setuptools 65.5.0
>pip install qtpy
>pip list
Package    Version
---------- -------
packaging  24.0
pip        24.0
QtPy       2.4.1
setuptools 65.5.0

>pyenv global 3.10.10
>pip list
Package    Version
---------- -------
colorama   0.4.6
pip        24.0
setuptools 65.5.0
tqdm       4.66.4

次に実行環境を確認をする。
https://qiita.com/t-fuku/items/83c721ed7107ffe5d8ff

>pyenv global 3.10.10
>python
>>> import sys
>>> sys.exec_prefix
'C:\\Users\\<name>\\.pyenv\\pyenv-win\\versions\\3.10.10'
>>> sys.executable
'C:\\Users\\<name>\\.pyenv\\pyenv-win\\versions\\3.10.10\\python.exe'

>pyenv global 3.11.5
>python
>>> import sys
>>> sys.exec_prefix
'C:\\Users\\<name>\\.pyenv\\pyenv-win\\versions\\3.11.5'
>>> sys.executable
'C:\\Users\\<name>\\.pyenv\\pyenv-win\\versions\\3.11.5\\python.exe'

これでProgram FilesおよびAppDataに依存しないPythonの環境を作成したことを確認できた。

ちなみに、環境変数を変更していなければ、AppData>pyenv>Program Filesの順で優先される、はず。
優先度を変えたい場合は環境変数から変更する。ただし、優先順位を間違えると酷い目に合うので注意。
https://qiita.com/jeyei/items/2c385e4e0488a5fa2591

venv

次にPythonのバージョンをvenvで切り替えられるようにする。

正常にダウンロードできたかは下のコマンドで確認する。

python -V
pip show pip
python
import sys
sys.exec_prefix
sys.executable
exit()

まずはvenvのファイルを三つ作成する。

>pyenv global 3.10.10
>python -m venv test_venv_1

>pyenv global 3.11.5
>python -m venv test_venv_2

>pyenv global 3.10.10
>python -m venv test_venv_3

>dir
2024/05/25  --:--    <DIR>          test_venv_1
2024/05/25  --:--    <DIR>          test_venv_2
2024/05/25  --:--    <DIR>          test_venv_3

次にtest_venv_1とtest_venv_2で指定したPythonのバージョンが入ったかを確認する。

test_venv_1
>cd test_venv_1
>.\Scripts\activate.bat
>pip show pip
~~~
License: MIT
Location: c:\users\<name>\documents\.venv\test_venv_1\lib\site-packages
Requires:
~~~
>python
3.10.10
>>> import sys
>>> sys.exec_prefix
'C:\\Users\\<name>\\Documents\\.venv\\test_venv_1'
>>> sys.executable
'C:\\Users\\<name>\\Documents\\.venv\\test_venv_1\\Scripts\\python.exe'
test_venv_2
>cd test_venv_2
>.\Scripts\activate.bat
>pip show pip
~~~
License: MIT
Location: C:\Users\<name>\Documents\.venv\test_venv_2\Lib\site-packages
Requires:
~~~
>python
Python 3.11.5
>>> import sys
>>> sys.exec_prefix
'C:\\Users\\<name>\\Documents\\.venv\\test_venv_2'
>>> sys.executable
'C:\\Users\\<name>\\Documents\\.venv\\test_venv_2\\Scripts\\python.exe'

Pythonのバージョンを引き継いだまま仮想環境を作成することに成功したことを確認。

次にtest_venv_3をPython3.10.10からPython3.11.5に変更する。

test_venv_3 変更前
>cd test_venv_3
>.\Scripts\activate.bat
>python -V
Python 3.10.10

venv内にあるpyvenv.cfgの中身をいじることで実現できる。

pyvenv.cfg 変更前
home = C:\Users\<name>\.pyenv\pyenv-win\versions\3.10.10
include-system-site-packages = false
version = 3.10.10

homeは動かしたいバージョンのフォルダーを、versionは動かしたいバージョンの数値を入れる。

pyvenv.cfg 変更後
+ home = C:\Users\<name>\.pyenv\pyenv-win\versions\3.11.5
- home = C:\Users\<name>\.pyenv\pyenv-win\versions\3.10.10
include-system-site-packages = false
+ version = 3.11.5
- version = 3.10.10

これでバージョンが切り替わる。

test_venv_3 変更後
>cd test_venv_3
>.\Scripts\activate.bat
>python -V
Python 3.11.5

これで君は、venvを使ってPythonのバージョンごと仮想環境を切り替えることができる!

Program Fileで作ったvenvの移行

test_venv_3で行ったようにhomeとversionを変える。

- home = C:\Program Files\Python310
+ home = C:\Users\<name>\.pyenv\pyenv-win\versions\<name>

使うバージョンが違うならversionも変更する。

- version = <以前のversion>
+ version = <使うPythonのversion>

ただし、この方法ではすでにインストールしているライブラリは使用できるが、pipを使用することができない(つまるところ、新たにインストールすることができなくなる)。

VScodeでグローバルなvenvの切り替え

Visual Studio Codeのファイル>ユーザ設定>設定に飛び、検索欄にpython pathと入力する。
Python:Venv Pathがあるので参照したいフォルダーを入力する。
そうすることによって、そのフォルダー下にあるvenvをすべて読み込むようになる。
ちなみに、デフォルトでは下の四つがUser/<name>のフォルダーにある場合、自動で読み取ってくれる設定にはなっている。

setting.json
"python.venvFolders": [
    ".venv",
    ".pyenv",
    "envs",
    ".direnv"
],

小話。

pyenvを使っていなかったころ。
Pythonをzipでダウンロードし、置きたいところに解凍する。その後、venvのフォルダーを作成し、pyvenv.cfgのhomeを解凍先のpython.exeのパスに変更する。それからいろいろ。
そんなことをやっていました。

・・・少し便利になったもんですね。

Discussion