マイクロソフトのインテリセンス(コード補完機能)は大変優秀だと個人的に思っている。
中でもVBAのインテリセンスが非常に優秀で
インテリセンスを効かせた書き方を意識して以降、生産性が数倍になった。
VSCodeでもインテリセンスの優秀さを引き継いでいるのか、
動的型付け言語のPythonでもバンバン補完機能を表示してくれる。
…が、特定のパターンでインテリセンスが出てこないことに気が付いた。
VSCodeでインテリセンスが効かない&一部に効かない場合の
解消方法を調査&検証した結果を整理してみた。
#前提条件
- VSCode 1.33.1
- CentOS7.6 64bit
- anaconda 4.6.14
- Python 3.7.3
#発生事象
外部モジュールをVSCodeが参照できていない模様
以下では、比較のため「標準モジュールの場合(問題なし)」と「外部モジュールの場合(問題あり)」を記載
##標準モジュールの場合(問題なし)
- インテリセンスが有効
- あるべき姿、ありがたや
外部モジュールの場合(問題あり)
外部モジュールのインテリセンスに関して、事象が2つ発生。
1. インテリセンスが完全に表示されないケース
これは、VSCode上で.を打った以降、候補が完全に表示されないのでわかりやすい(参考画像なし)
2. 一部インテリセンスの候補がおかしいケース
下図がその事例。
本来、pyarrow.parquetモジュールはwrite_
と入力すれば
write_table
、write_to_dataset
、write_metadata
と
write_
から始まるファンクションが3つ表示されるはずだが
なぜか表示されずに_parquet_writer_arg_docs
という見当違いの候補が出る。
このエラーは、モジュールのドキュメントとインテリセンスを見比べないと発見できない。
「なんで効かないんだろ?でもコードは動くからいいか…」で見過ごすユーザーもいると思う1。
##原因と対策
【原因】インテリセンスが効かない事象は、VSCodeの初期設定値が原因
1. 初期値では、外部モジュールのパス指定がない(故に認識できていない)
2. 初期値のインテリセンスエンジン(jedi)がうまく動かない2
【対策】VSCodeの設定ファイル(settings.json)を2か所変更
1. インテリセンス参照先に、外部モジュールのパスを追記
2. インテリセンスエンジンをMicroSoft Language Serverに変更
#手順
ここからは、インテリセンスを有効化するための手順を解説
1. 外部モジュールのパスを確認
$ sudo find -name "pyarrow"
./home/myuser/.conda/envs/py3.7/lib/python3.7/site-packages/pyarrow
./home/myuser/.conda/pkgs/pyarrow-0.11.1-py37he6710b0_0/lib/python3.7/site-packages/pyarrow
find: ‘./run/user/1000/gvfs’: 許可がありません
$
2つあるけど、どちらもsite-packages/
配下が共通のようなので↓を登録してみる
./home/myuser/.conda/envs/py3.7/lib/python3.7/site-packages/pyarrow
2. 設定ファイル(settings.json)を編集
①ファイル -> ②基本設定 -> ③設定 -> ④設定の検索 に python.autoComplete.extraPaths と入力
④のあと、settings.jsonをクリック、json形式でパスを記述。
記述例を2つ挙げます。
ここでは、外部パスの記述と同時に、インテリセンスエンジンにjediを利用しない設定も記述してます
【例1】・・・完全に初期状態での記述の場合↓
{
"python.autoComplete.extraPaths": [
"/home/myuser/.conda/envs/py3.7/lib/python3.7/site-packages/"
],
"python.jediEnabled": false
}
【例2】・・・複数の既存設定がある場合(カンマ区切りで追加。末尾でなくてもよい)↓
{
"既存項目A": false,
"既存項目B": true,
"既存項目C": [
"Cの内容"
],
"python.autoComplete.extraPaths": [
"~.conda/envs/py3.7/lib/python3.7/site-packages/"
],
"python.jediEnabled": false
}
###3. 保存
赤丸部分にカーソル合わせると×ボタンになる。
×ボタン押下し閉じるときに保存を選択
###4. 結果確認
VSCodeを再起動後、インテリセンスの挙動を確認する。
外部モジュールでも、インテリセンスが無事に表示された。
※下記に個人設定を記述したので、参考になれば幸いです
個人メモ【VSCodeの設定】
-
インテリセンス
- 外部モジュールパス:
"python.autoComplete.extraPaths"
- condaで作成した仮想環境下のライブラリを指定
"~.conda/envs/py3.7/lib/python3.7"
など - zip圧縮されたモジュールも読込対象とするため、拡張子.zipも記述
- condaで作成した仮想環境下のライブラリを指定
- 外部モジュールパス:
-
flake8(コードフォーマット)の設定
- 有効/無効:
"python.linting.flake8Enabled"
-
true
で有効
-
- フォーマット設定:
"python.linting.flake8Args"
-
"--ignore=E501"
で、1行の記述文字長制限を外す
-
- 有効/無効:
-
エディタの設定
- フォントサイズ:
"editor.fontSize"
- 14ポイントに設定(解像度の関係で大き目にした)
- 保存時のフォーマット自動成型:
"editor.formatOnSave"
-
true
で有効
-
- フォントサイズ:
-
condaコマンドの設定
- condaのパス:
"python.condaPath"
-
"/usr/local/anaconda3/bin/conda"
を指定 ※人によって違います
-
- condaのパス:
-
インテリセンスエンジンの設定
- エンジンにjediを利用するか:
"python.jediEnabled"
-
false
でエンジンはMicroSoft Language Serverに変更
-
- エンジンにjediを利用するか:
{
"python.autoComplete.extraPaths": [
"~.conda/envs/py3.7/lib/python3.7/lib-dynload",
"~.conda/envs/py3.7/lib/python3.7/site-packages"
],
"python.pythonPath": "python",
"python.jediEnabled": false,
"python.linting.flake8Enabled": true,
"editor.formatOnSave": true,
"python.autoComplete.addBrackets": true,
"python.linting.flake8Args": [
"--ignore=E501"
],
"editor.fontSize": 14,
"python.analysis.symbolsHierarchyDepthLimit": 20,
"python.condaPath": "/usr/local/anaconda3/bin/conda",
"terminal.integrated.rendererType": "dom"
}
#参考
-
一部外部モジュールの認識エラーについては、下記のqiitaの記事を参考にしました。
- [Enable python intellisense for Visual Studio Code.]
(https://qiita.com/null_Y_K/items/b208a0049d1acd4a3ead)
- [Enable python intellisense for Visual Studio Code.]