Visual Studio Codeの設定「虎の巻」:Python編:特集:Visual Studio Codeを使いこなそう!
VS CodeでPythonプログラミングを快適に行うのに必須である拡張機能のインストールと、その機能や設定項目を紹介する。
* 本稿は2017年11月24日に公開した『Visual Studio Codeの設定「虎の巻」:Python編』をバージョン1.22に合わせて改訂したものです。
前回までは、Visual Studio Code(以下、VS Code)のIDEの全般的な設定方法や、ワークベンチやエディタの配色、構文ハイライトのカスタマイズについて見てきた。今回はVS CodeでPythonプログラミングを行う上で必須となるPython拡張機能と、その使い方と設定項目などについて取り上げる。
なお、ここではWindows版のVS Code 1.22.2と、Python.orgからインストールしたPython 3.6.5で動作を確認している(macOS版のVS Codeでも一応の確認はした)。
Python拡張機能
VS CodeでPythonを使ってコードを書こうという場合、Microsoft自身が提供しているPython拡張機能をインストールするのがお勧めだ。この拡張機能をインストールせずに、Pythonファイルを作成すると、VS Codeのウィンドウ右下にPython拡張機能のインストールを推奨するメッセージが表示される(以下の画像。VS Codeのバージョンによっては、ウィンドウ上部に横長のメッセージが表示されるかもしれない)。
実際、この拡張機能が提供するのは、次のような機能であり、これらがなければVS CodeでどうやってPythonプログラミングを行えばよいのか分からないくらいだ。
- Lint機能(使用するLinterを設定可能)
- IntelliSense
- 自動インデント/自動フォーマット
- リファクタリング
- コードナビゲーション
- デバッグサポート
- ユニットテスト
- VS Codeの統合ターミナルでのPythonコードの実行
- オフラインのヘルプファイル
- スニペット
上の画像にある[インストール]ボタンをクリックすると、インストールが自動的に始まる。最後に[再読み込み]ボタンをクリックして、インストールした拡張機能が有効になる。
これで万事オーケーかというと、そうでもない。次のようにいきなりエラーメッセージが表示される人もいるだろう。
これはpylint(Python用の代表的なLinter)がインストールされていないか、パスが通っていないために、Python拡張機能がpylintを見つけられていないことを示している。
それと同時に、次のようなメッセージがステータスバーに表示されるかもしれない。
これは複数のバージョンのPythonがインストールされているときなどに表示される(既に使用するPythonのバージョン/環境を選択済みであれば、このメッセージではなく、使用するPythonのバージョン/環境が表示されるはずだ)。
筆者のWindowsマシンにはPython 3.6.5(64ビット)、Anaconda 4.4.10、Python 2.7.13(32ビット)などのバージョンがインストールしてある。また、macOSであれば、Python 2が標準でインストールされているところに、Python 3をさらにインストールして利用している方もいるだろう。VS CodeのPython拡張機能では、どのバージョン(あるいはvenvやpyenvなどを使って仮想環境を構築しているのであれば、どの仮想環境)を使用するかを選択できるようになっている。
いずれにせよ、これらのメッセージと出会ったら、それぞれを解決しておこう。どちらを修正すべきかというと、後者からだ。適切なPython環境を選択すれば、pylintも見つかるかもしれないからだ。
使用するPythonのバージョン/環境を指定するには、上に示した「Select Python Environment」というメッセージ(あるいは、同じ箇所に表示されるPythonのバージョンや環境)をクリックするか、[Ctrl]+[Shift]+[P]キー(macOSでは[Command]+[Shift]+[P]キー)でコマンドパレットを表示して、「select interpreter」などと入力する。これにより、Python機能拡張が認識しているPython環境が一覧表示されるので、そこから使用したいものを選択すればよい。
ここで設定した内容は、ワークスペース設定として保存される(VS Codeで開いたディレクトリにある.vscodeディレクトリ内のsettings.jsonファイルに保存される)。この状態で、pylintが見つかれば、「pylintが見つからない」というメッセージは表示されたままでも、pylintによるLintの実行が可能となる。例えば、以下はPython 3.6.5を使用するように設定してから、インデントをわざと間違えてコードを記述したところだ。
Lint機能を使っている場合、エラーがあるファイルについては、[エクスプローラー]ビューでそのファイル名が赤い文字で表示されるとともに、右側にエラーの数が表示される。
Pythonのバージョン/環境を指定しても、pylintが見つからない場合には、[Install]ボタンをクリックして、インストールをしておこう。上のメッセージを見ても分かるように、Lint機能そのものを無効化したり、pylintによるLintを無効化したりすることもできる。「Lintとか使わない」という場合には、無効化してもよい。
注意点としては、Pythonのバージョン/環境指定(実行するpythonコマンドのパス指定)はあくまでもVS Codeが何かを実行するときに参照するものであるということ。統合ターミナルからプログラマーが「手作業」で何らかの作業を行う場合には、実行するPythonを明示的に指定してやる必要があるかもしれない。ただし、コマンドパレットには以下のコマンドがあるので、これらを活用することで、実際には明示的にバージョンを指定するような作業はそれほど多くはないかもしれない(これらのコマンドについては後述する)。
- [Python: ターミナルで Python ファイルを実行]:現在エディタで編集中の.pyファイルを統合ターミナルで実行
- [Python: Python ターミナルで選択範囲/行を実行]:現在エディタで選択している範囲を統合ターミナルで実行
- [Python: REPLを開始]:選択したPython環境でREPLを実行
- [Python: Create Terminal]:選択しているPython(の仮想)環境を有効化して、統合ターミナルを開く
特に最後の[Python: Create Terminal]は仮想環境を使っている場合には便利かもしれない。
なお、pylintのインストールでエラーが発生する場合には「WindowsのVisualStudioCodeでPython」Wikiの「設定」ページなども参考にしよう。
次にPython拡張機能でできることを幾つか見てみよう。
Python拡張機能でできること
Python拡張機能をインストールすることで、VS CodeではIntelliSenseを利用したコーディングや上で見たLint機能の利用、統合ターミナル内でのPythonコードの実行、デバッグ実行などが可能になる。これらについて簡単に見ておこう。
IntelliSenseについては説明不要だろう。コードを入力していくに連れて、Microsoftお得意のコード補完機能がビシバシと効いてくれる。
Lint機能については、以下でも説明するLint関連の項目の設定を行い、必要に応じてパッケージをインストールすることで、コードの記述時に自動的にLintツールがチェックしてくれるようになる。設定方法については以下の「VS Codeの設定項目」を参照されたい。
統合ターミナルでのPythonコードを実行するには、先ほども述べたように、対象のファイルをエディタで選択して、コマンドパレットで「run python」などと入力して[Python: ターミナルで Python ファイルを実行](Python: Run Python File in Terminal)コマンドを選択すればよい。以下はその例だ。コマンドパレットには[Python: ターミナルで Python ファイルを実行]コマンドと[Python: Python ターミナルで選択範囲/行を実行]コマンドが表示されている。ここで前者を選択すると、その下の統合ターミナルに表示されているように、pythonコマンドを使ってそのファイルが実行される。
もう1つの[Python: Python ターミナルで選択範囲/行を実行]というコマンドは、統合ターミナル内で対話環境を起動し、そこにコードを流し込むといった使い方をするのだと思われる。以下に例を示す。これは今述べた通り、統合ターミナルで対話環境を起動して、コマンドパレットでこのコマンドを選択しているところだ。すると、下の対話環境に表示されているように、選択範囲が実行される。
Pythonコードを書いていて、対話環境でそのコードを試してみたくなるというのはよくあることで、そのような場合にはこちらのコマンドを使うことで、簡単にコードの動作を確認できるだろう。
より直接的に、対話環境(REPL環境)を実行することも可能だ。これには、コマンドパレットから[Python: REPL を開始]コマンドを実行する。
デバッグ実行もとても簡単に行える。ウィンドウ左端のアクティビティーバーで[デバッグ]アイコンをクリックして、サイドバーに[デバッグ]ビューを表示する。一番簡単なのは、デバッグの構成を行わないまま、[デバッグの開始]ボタン(緑色の三角のボタン)をクリックするだけだ。すると、デバッグ構成を行うための選択肢が表示される。
本稿執筆時(2018年4月23日)には、[Python]と[Python Experimental]の2つの選択肢があるが、後者は新しいデバッガを使用する場合の構成となる。詳しくは「Meta issue for the experimental debugger」などを参照されたい。ここでは[Python]を選択しよう。これにより、選択した設定でデバッグが開始される。ただし、ブレークポイントなどを設定していないと、エラーがない限りは、そのまま実行が完了してしまうこともあるので、注意しよう。以下はブレークポイントを設定した上で、デバッグ実行を行っているところだ。
[デバッグの開始]ボタンの隣にある歯車アイコンをクリックすると、上で見たのと同様に[Python]か[Python Experimental]のどちらかを選択するウィンドウが表示されるので、いずれかを選ぶと(ここでは[Python]を選択した)、デバッグ構成を記述するlaunch.jsonファイルが自動的に作成される。本稿で見ているような簡単なプログラムであれば、修正の必要はほぼないだろう。launch.jsonファイルを作成したら、デバッグ構成の中から[Python: Current File]を選択して、[デバッグの開始]ボタンをクリックすればよい。このとき、重要なのはエディタでlaunch.jsonファイルではなく、デバッグ対象のファイルを選択しておくことだ。これにより、そのファイルをエントリポイントとしてデバッグが開始される。
launch.jsonファイルではおおよそ次のような内容を指定する。これはデフォルトで作成されるlaunch.jsonファイルから[Python Current File]と[Python: Attach]の2つの構成を抜き出して、そこに幾つかの要素とコメントを加えたものだ。configurations項目には「Python: Current File」「Python: Attach」などの名前が付けられた構成情報が列挙される。これらの名前が[デバッグ]ビューの[デバッグの開始]ボタンの隣にあるドロップダウンに表示される。
{
"version": "0.2.0",
"configurations": [
{
"name": "Python: Current File",
"type": "python",
"request": "launch",
"stopOnEntry": true,
"pythonPath": "${config:python.pythonPath}",
"program": "${file}",
"cwd": "${workspaceFolder}",
"console": "integratedTerminal",
"internalConsoleOptions": "openOnFirstSessionStart"
},
{
"name": "Python: Attach",
"type": "python",
// …… 省略 ……
"host": "localhost"
},
// …… 省略 ……
]
}
上で使用しているものを中心に、Pythonコードのデバッグ構成で指定可能な項目を以下に示す(一部)。以下の表の「上で設定している値」列には「Python: Current File」構成のものを記してある。
項目 | 説明 | 上で設定している値 |
---|---|---|
name | 構成の名前。[デバッグの開始]ボタンの隣に表示される | "Python: Current File" |
type | 使用するデバッグの識別子 | "python" |
request | プログラムを起動するか(launch)、アタッチするか(attach) | "launch" |
stopOnEntry | 開始時にデバッグ実行を中断するかどうか。これを省略するか、falseにした場合には開始時に中断されない | true |
pythonPath | 使用するpythonコマンドへのパス | "${config:python.pythonPath}" |
program | デバッグ対象のファイルの絶対パス。"${file}"を指定すると、VS Codeで現在選択されているファイルとなる | "${file}" |
cwd | デバッグ時のカレントディレクトリ | "${workspaceFolder}" |
env | デバッグで必要な環境変数の設定 | 未指定 |
envFile | 環境変数の設定を記述したファイルの絶対パス | 未指定 |
debugOptions | デバッグ実行のオプション | 未指定 |
onsole | 使用するコンソールの指定 | "integratedTerminal", |
internalConsoleOptions | 統合ターミナル使用時の[デバッグ コンソール]表示設定 | "openOnFirstSessionStart", |
windows | Windowsでデバッグ実行するときの構成 | 未指定 |
osx | macOSでデバッグ実行するときの構成 | 未指定 |
linux | Linuxでデバッグ実行するときの構成 | 未指定 |
構成可能な要素 |
デバッグ実行時にpythonコマンドでプログラムを実行するときにはrequest項目を「launch」とする。既に実行中のプログラムのデバッグをするなら「attach」となる。現在はlaunch.jsonファイルの生成時に、両者の設定が含まれるようになっているので、自分で記述する際には参考にしてほしい。stopOnEntry項目がtrueの場合、デバッグ実行開始時に中断する。falseにすると、中断することなく実行が開始される。cwd項目はデバッグ実行時のカレントディレクトリを、env/envFile項目は、デバッグ実行で指定する必要がある環境変数の設定を指定するものだ。
pythonPathの値は「config:python.pythonPath」となっているが、これは(ご想像の通り)ワークスペースなどの設定で指定したpythonコマンドのパスを参照することを意味している。このことからも、ワークスペース(あるいはユーザー)単位で使用するPythonのバージョンを指定するのが重要になる。
debugOptions項目では以下の値を配列形式で指定する(一部)。指定がない場合は、"RedirectOutput"のみが指定されたものとして解釈される。
- "RedirectOutput":プログラムの出力を全て統合ターミナルの[デバッグ コンソール]に表示する(デフォルトで指定される。後述のconsole項目の設定も参照)
- "DebugStdLib":標準ライブラリのデバッグを行う
- "Django":Django(Python用Webアプリフレームワーク)に固有のデバッグ機能を使用するときに指定する
- "Pyramid":Pyramid(Python用Webアプリフレームワーク)を使用する際に指定する
console項目には"none"(統合ターミナルの[デバッグ コンソール]タブに表示。デフォルト値)か"integratedTerminal"(統合ターミナルの[ターミナル]タブ)か"extrnalTerminal"(外部ターミナル)を指定できる。これらはプログラムの出力をどこに送るかを指定するもので、この値が"none"かつdebugOptionsで"redirectOutput"を指定していると、出力が[デバッグ コンソール]に送られる。他の2つを指定した場合は、"redirectOutput"は無視される。これら2つの設定の組み合わせで実際に[デバッグ コンソール]タブへの出力がどう変わるかは読者自身でも試行錯誤してみてほしい(筆者が試した限りは常に[デバッグ コンソール]タブに出力が送られるようにも感じられた)。
internalConsoleOptions項目は統合ターミナルにある[デバッグ コンソール]タブの表示方法を指定するものだ。指定可能な値は"neverOpen"([デバッグ コンソール]タブにフォーカスを移動しない)、"openOnFirstSessionStart"(最初のセッションで[デバッグ コンソール]を表示する)、"openOnSessionStart"(セッションのたびに[デバッグ コンソール]を表示する)の3つ。
この他にも設定可能な項目はあるが、それらについては「Debugging Python with VS Code」ページを参照されたい。
次にVS Code(+Python拡張機能)におけるPython関連の設定項目を見ていこう。
VS Codeの設定項目
VS Codeで[ファイル]メニュー(macOSでは[Code]メニュー)から[基本設定]−[設定]を選択すると、ユーザー設定/ワークスペース設定を行うためのウィンドウが表示される。ウィンドウ上部の[設定の検索]ボックスに「python」と入力することで、Python関連の設定項目が表示される。
本稿執筆時点(2018年4月23日)では、設定項目を「python」でフィルタリングすると79個の項目がマッチする(インストールしている拡張機能にもよるだろう)。ここではその中から幾つかの項目を紹介しよう(項目先頭の「python.」は省略する)。
項目 | 説明 |
---|---|
pythonPath | 使用するpythonコマンドへのパス |
linting.enabled | Lint機能を有効にするかどうか |
linting.pylintEnabled | Linterにpylintを使用するかどうか |
linting.lintOnSave | ファイル保存時にLintを実行するか |
formatting.provider | Pythonコードの整形に何を使用するか |
VS Codeで設定可能なPython関連の項目(抜粋) |
例えば、上の表で紹介した「python.linting.enabled」項目はPythonコードのLint機能を有効にするかどうかを指定するもので、デフォルト値はtrueとなっている。同じく「python.linting.pylintEnabled」項目はLintにpylintを使用するかどうかを指定するもので、デフォルト値はtrueとなっている。両者のデフォルト値がtrueであることから、本稿の冒頭で見たようにPython拡張機能をインストールした時点でpylintの存在確認が行われ、「pylintがないよ」というメッセージが表示されたわけだ。もちろん、「python.linting.enabled」項目をfalseにすればLint機能が無効化される。
「python.pythonPath」項目は上でも述べたように、実行するPythonのバージョンを指定するものだ。多くの場合は、ワークスペース単位で設定することになるだろう。
Lint関連の設定項目
設定可能な項目の多くはLint機能、ユニットテストなどに関連するものだ。Lint機能については、上で紹介したpylint以外にも多くのLinterがサポートされている。例えば、ユーザー設定でpylintを無効化して、pep8を有効にしてみよう。
{
…… 省略 ……
"python.linting.pylintEnabled": false,
"python.linting.pep8Enabled": true
}
このようにすると、環境によっては、pep8(PythonコードのスタイルガイドであるPEP 8に準拠した形でPythonコードのLintを行うツール)がインストールされていないというメッセージが表示されるかもしれない。その場合には、[Install]ボタンをクリックするか、コマンドラインからpipコマンドを使うかして、パッケージをインストールしておこう。
必要に応じてpep8パッケージをインストールすると、今度はPEP 8スタイルでのLintが行われるようになる。以下はその例だ。本フォーラムではインデントは2タブ(半角スペース2つ)で付けるようにしているため、コード例も2タブとなっている。そこで、Linterが「4タブでない」と怒っているところだ。
今見たpylint、pep8以外にもprospectorやflake8、pydocstyle、型ヒントを付加したPythonコードの静的チェックに使えるmypyなど、多くのLinter/コードチェッカーがサポートされているので、普段から使用しているものを有効にすれば、Pythonプログラミングがはかどるようになるはずだ。
Lint関連では他にも、Linterが返してくる重大度(シビアリティ)をVS Codeではどのような方法で表示するかなども設定できるので、興味のある方はいろいろと試してみよう。
コードの整形
コードの整形は「python.formatting.〜」項目で設定する。基本的には必要なパッケージをインストールしてから、「python.formatting.provider」項目で整形にautopep8、yapfのいずれかを指定して(デフォルト値は「autopep8」)、「editor.formatOnSave」項目をtrueにすればよい。なお、editor.formatOnSave項目はPythonに固有の設定ではなく、VS Codeのユーザー/ワークスペース設定にある項目となる(以前はpython.formatting.formatOnSaveという設定項目があったが、これは廃止されている)。
項目 | 説明 |
---|---|
python.formatting.provider | Pythonコードの整形に何を使用するか |
editor.formatOnSave | ファイル保存時にコードを整形するかどうか |
コードの整形に関連する項目 |
例えば、pep8形式でファイルの保存時にコードを整形するには、「pip install pep8」(Windowsでは「py -3 -m pip install pep8」)と「pip install -upgrade autopep8」(Windowsでは「py -3 -m pip install -upgrade autopep8」)の2つのコマンドを実行した後で、python.formatting.provider項目に"autopep8"を指定し、editor.formatOnSave項目をtrueにする(ここではコマンドラインを紹介したが、設定を変更してから、必要なパッケージをVS Codeにインストールしてもらってもよい)。Pythonについてのみ、ファイル保存時にコードの整形を行うのであれば、次のようにPythonに固有の設定として記述する方法もある(筆者が試したところでは、Python固有の設定にすると、Windows環境ではうまく整形されなかったこともあった)。
{
// 省略
"[python]": {
"editor.formatOnSave": true
},
}
コードの自動整形が必要であれば、これらの項目を活用しよう。
Jupyter
Python拡張機能は以前はJupyterをサポートしていたのだが、現在ではJupyter用の拡張機能が単独で提供されるようになっている。これをインストールすることで、VS CodeとJupyterを統合できる。
Jupyterを使いたければ、[拡張機能]ビューから「Jupyter拡張機能」をインストールしよう。もちろん、必要に応じて「py -m pip install jupyter」「python3 -m pip install jupyter」などのコマンドでJupyterをインストールして、さらに「py -m pip matplotlib numpy」「python3 -m pip install matplotlib numpy」などのコマンドで必要なパッケージをインストールしておくこと(処理系によってはこれらは必要ないかもしれない)。
例えば、以下はJupyter拡張機能をインストール後、test.pyファイルにJupyter拡張機能ページで紹介されているサンプルコードを入力したところだ。コードレンズに[Run cell]というリンクが表示されていることが分かる。
[Run cell]リンクをクリックしてみよう。すると、以下のようにVS Code内でセルの内容を実行して、その結果を表示できるようになる(うまくいかないときには、統合ターミナルからインストールしたパッケージがきちんとインストールできているかを確認したり、コマンドプロンプトなどからパッケージをインストールしたりしてみよう)。
このように、Python拡張機能とJupyter拡張機能の2つの拡張機能(と必要なパッケージ、ツール群)をインストールすれば、VS Codeの中だけで快適にPythonライフを送れるようになる。
今回はVS CodeでPythonプログラミングを行う上での設定の基本要素を紹介した。次回はvenvなどの仮装環境を利用して、Pythonプログラミングを行う上での勘所を紹介する予定だ。
Copyright© Digital Advantage Corp. All Rights Reserved.