VSCode + Remote WSL で Python を書く
ずっと Visual Studio 一本でコードを書いてきたけど、最近 VSCode の方も触るようになった。しばらく触ってなかった Python3 を書こうと思い立ち、環境を整えたのでメモ。
Remote WSL の使い方を知らなかった
最初、「Remote WSL って、統合ターミナルで Bash on WSL が開ける拡張かな~」と大きな勘違いをしていた。
上の記事を読んで分かったのだが、Remote WSL を使うと WSL 上に VSCode Server が立って、あたかも Linux 上で VSCode を使っているような環境を構築してくれるのだ。ビルドもデバッグも WSL 上でやって、その結果を Windows 側の GUI に表示してくれるという、便利極まりない機能だ。
今まで node.js も Python も、実際に動かすのは Linux だけど、開発のためだけに Windows にも環境を整える……ということをやっていた。二度手間になっていたし、Windows だとうまく動かないパッケージがあって開発を諦めることもあった。Remote WSL なら Linux 実機と同じフローで環境整備ができるし、実機にかなり近い環境でデバッグができる。
拡張機能のインストールは別々に
Windows 側の VSCode と、WSL 側の VSCode Server は別インスタンスになっているので、拡張機能をそれぞれにインストールする必要がある。でも WSL 側へのインストールも "Install on WSL" のボタンをクリックすれば済むので簡単。
今回は Python3 を書きたいので、WSL 側には Python Extension Pack さえ入れておけばおk。
pipenv
npm でいうところの package.json
的なものは何か?
調べると、Python のパッケージマネージャーって、なんかやたら種類がある。とりあえず pipenv を使うことにした。
初期化:
$ pipenv --python=/usr/bin/python3
この時、python インタプリタのパスを必ず明示的に指定する。pipenv --python 3
とかだと、Windows 側の python.exe を実行しようとして死んでしまう。
これで仮想環境が自動的に構築される(裏では virtualenv が走っている)。
パッケージのインストール:
$ pipenv install hogehoge
npm i hogehoge --save
相当。--dev
オプションをつけると、npm i hogehoge --save-dev
と同じ意味になる。
パッケージの依存関係は Pipfile
、Pipfile.lock
に記録される。この2つのファイルの関係は npm でいう package.json
と package-lock.json
と一緒。
復元:
$ pipenv sync
npm i --production
に相当する。--dev
をつければ npm i
(引数なし)と一緒の意味。
仮想環境?
pipenv は virtualenv を使って仮想環境を作る。でも仮想環境って何なん?
この記事で大体把握した。npm なら node.js バージョン間の違いは小さいし、後方互換性が保たれてるから、たいして問題にはならないけど、Python だと 2.x と 3.x で文法が違うから、仮想環境に閉じ込めて管理するのがラク、ってことなのかな。
モジュールを認識しない?
Q: インストールしたはずのパッケージを、VSCode がいつまで経っても認識しなくて赤線が出っぱなし。ナンデ?
A: そのパッケージは virtualenv で作った箱庭(=仮想環境)に閉じ込められてるから、外から参照できない。VSCode をその仮想環境に入れる必要がある。
で、デフォルトでは VSCode が仮想環境を認識してくれないから、設定をいじる必要がある。詳しくはここを読んでほしい。
pipenv + virtualenv では、仮想環境は ~/.local/share/virtualenvs/<名前>
に生成されるようだ。したがって、
- リモート [WSL] 設定の
python.venvFolders
に.local/share/virtualenvs
を追加 - ワークスペースの
.vscode/settings.json
に"python.venvPath": ".local/share/virtualenvs"
と書く
のどちらかの設定をしてから、画面左下の Python バージョンが書いてある所を押すと、作った仮想環境が出てくる。
これで IntelliSense も効くようになったし、快適に Python が書けそうだ。