カテゴリー
Python VSCode Windows

VSCode+venv

python では venv を使ってプロジェクトごとに実行環境を切り替えるのがセオリーらしい。これを Windows 環境で VSCode と組み合わせるための自分なりのベストプラクティスを以下に示す。 前提として、python は本家ではなく Microsoft Store のものを入れている。この場合、python バイナリの置き場所は以下のようになる。

PS D:\> which python
C:\Users\hotta\AppData\Local\Microsoft\WindowsApps\python.EXE
PS D:\> which python3
C:\Users\hotta\AppData\Local\Microsoft\WindowsApps\python3.EXE
PS D:\> which pip
C:\Users\hotta\AppData\Local\Microsoft\WindowsApps\pip.EXE
PS D:\> which pip3
C:\Users\hotta\AppData\Local\Microsoft\WindowsApps\pip3.EXE

venv を使う、おおまかな手順としては、以下の通り。

  1. 作業用のディレクトリ(名前は任意)を作成して、そこに入る。
  2. その中に仮想環境を作成する。
    • 本来、この 仮想環境名(ディレクトリ名)は何でもよいのだが、env という名前にしておけば、VSCode が自動認識してくれる。
  3. 仮想環境に入って(=仮想環境を使って)開発する。
  4. 作業が終わったら仮想環境から抜ける。

まず、実行に先立って PowerShell を起動し、PowerShell スクリプトへの(*.ps1)の実行権限を与えておく。これは初回のみ実行すればよい。

PS D:\> Set-ExecutionPolicy RemoteSigned -Scope CurrentUser

次にプロジェクト用のディレクトリを作成する。ここではコマンドラインで例示しているが、エクスプローラで作成してもよい。

PS D:\> mkdir xxx

VSCode を起動して、VSCode でこのフォルダを開く。その後 [ターミナル]>[新しいターミナル] で PowerShell のターミナルを開き、その中で実行する。

PS D:\xxx> python -m venv env

これによりカレントディレクトリ/env ディレクトリ配下に仮想環境が作られ、python 本体やpip コマンド、追加ライブラリ用のディレクトリ等が作られる。

PS D:\xxx> ls ./env/Scripts
Mode           LastWriteTime  Length Name
----           -------------  ------ ----
-a----  2020/02/14     13:30    2274 activate
-a----  2020/02/14     13:30     952 activate.bat
-a----  2020/02/14     13:30    1483 Activate.ps1
-a----  2020/02/14     13:30     368 deactivate.bat
-a----  2020/02/14     13:30  103286 easy_install-3.7.exe
-a----  2020/02/14     13:30  103286 easy_install.exe
-a----  2020/02/14     13:30  103268 pip.exe
-a----  2020/02/14     13:30  103268 pip3.7.exe
-a----  2020/02/14     13:30  103268 pip3.exe
-a----  2020/02/14     13:30  522824 python.exe
-a----  2020/02/14     13:30  522312 pythonw.exe

なお、ここでは venv 作成時のコマンド名は ‘python’ で例示している。Windows の場合は通常 python2 は入っていないので、コマンド名としての python は python3 と同じものを指している。Mac や Linux の場合はシステムが使っている python2 と区別するため、python3 と明記して起動する。

PS D:\xxx> .\env\Scripts\Activate.ps1
(env) PS D:\xxx> which python
D:\xxx\env\Scripts\python.EXE
(env) PS D:\xxx> which pip
D:\xxx\env\Scripts\pip.EXE

activetes.ps1 コマンドの実行により仮想環境に切り替わる。仮想環境では、python.exe と pip.exe は env ディレクトリ配下にインストールされたものを指すようになる。

ここで、VScode が venv の作成を検出した場合、以下のダイアログが表示されるので Yes で応答する。このダイアログは初めて env という名前の仮想環境を作成した場合にのみ現れる模様。

Activate.ps1 は Windows (PowerShell)用のコマンドであり、他にもコマンドプロンプト用の activate.bat や Mac/Linux 用の activate コマンドが用意されている。

ちなみにこれは、手動で仮想環境に切り替える手段を例示したものである。今回の手順を最後まで作業して特に問題なければ、スクリプトを ▶クリックで実行する際、VSCode が自動的に仮想環境に切り替えてくれるようになる(ことを目指して試行錯誤中)。

(env) PS D:\xxx> $env:VIRTUAL_ENV
D:\xxx\env

仮想環境にいる間は、プロンプトの先頭に ‘(env)’ が表示される、また、VIRTUAL_ENV という環境変数がセットされていることがわかる。

(env) PS D:\xxx> python -m pip install --upgrade pip
(env) PS D:\xxx> pip -V
pip 20.0.2 from d:\xxx\env\lib\site-packages\pip (python 3.7)
(env) PS D:\xxx> pip list
Package    Version
---------- -------
pip        20.0.2
setuptools 41.2.0

これで pip が最新になった。後は pip コマンドで開発に必要なパッケージをインストールできるようになった。

ここで、いったん VSCode を再起動する。 先程のフォルダが開かれたままになっているので、[ファイル]>[新規ファイル]で hello.py を作成する。中身は以下の程度でよい。

print("hello, world!")

この後、画面右上にある▶(プログラムの実行ボタン)をクリックすると、VSCode が自動的に env を検出して仮想環境内で実行してくれる。

代替案

VSCode を再起動しても仮想環境をうまく検出してくれない場合、.vscode/settings.json を直接修正しても同じ効果が得られる。このディレクトリ/ファイルがない場合はプロジェクト直下に .vscode ディレクトリを作り、その中に settings.json ファイルを作ればよい。

{
    "python.pythonPath":  "env/Scripts/python.exe"
}

利用開始

pip の設定を変更したい場合は env ディレクトリ直下に pip.ini ファイルを作成する。

(env) PS D:\xxx> vim env\pip.ini (もしくは vscode で作成)

後は必要なパッケージ等を追加する。

(env) PS D:\xxx> pip install xxxx
(env) PS D:\xxx> pip list

VSCode のターミナルで pip install したモジュールは、VSCode から即座には認識されない。この場合、いったん VSCode を再起動すればよい。

当該シェル内で仮想環境を抜けたい場合 (オプション) 。

(env) PS D:\xxx> deactivate
PS D:\xxx> 

なお、仮想環境は当該シェル内の状態に過ぎない。そのシェル自体(VSCode であれば、ワークスペースや VSCode 自体)を終了することで、結果的に仮想環境からも抜けることになる。

おまけ

VSCode にインストール済みの拡張機能一覧を表示する。

(env) PS D:\xxx> code --list-extensions
ms-python.python
ms-vscode.powershell
(以下略)