Visual Studio CodeとPython


# 概要

WindowsでのPythonの環境構築、Visual Studio Code（以下VSCode）での拡張機能の説明（解析、Notebook、コード整形、デバッグなど）について説明します。

💡 [かごもく #40 開発環境の紹介 - connpass](https://kagoben.connpass.com/event/200585/)発表用の資料です。

---

# Python環境構築

Python環境構築では、インタプリタ（python）バージョン切替、仮想環境（インタプリタバージョンとパッケージのセット）切替、そしてパッケージ管理に何を選定するかを決める必要があります。

---

## Python環境構築のパターン

Windowsではおおむね以下のパターンとなるかと思います。

1. Anaconda
1. Python + py.exe + venv + pip
1. Python + WSL2(Ubuntu) + pyenv + venv + pip

💡 py.exe(or pyenv) + venv + pip以外に、pipenv、poetryなどもあります。

---

### Anaconda

- Windows上に[Anaconda](https://www.anaconda.com/)をインストール
- インタプリタ切り替え、仮想環境切り替え、パッケージ管理をまとめて行うことができる
- 機械学習に関連したライブラリが最適化されている（速度が速い）
- 公式リポジトリの利用規約は要確認
    - https://www.anaconda.com/terms-of-service

---

### Python + py.exe + venv + pip

- Windows上に[Python Windows版](https://docs.python.org/ja/3/using/windows.html)をインストール
- Windows版のPythonはインタプリタ切替のランチャ（py.exe）が標準添付
- venv等で仮想環境を構築し、pipでパッケージ管理を行う
- Windowsでは動作しないライブラリもある（例：uvloop）

---

#### Python + py.exe + venv + pip コード例

```powershell
py -3.6 -m venv .venv
& .\.venv\Scripts\Activate.ps1
python --version
pip install -r requiremtns.txt 
```

---

### Python + WSL2(Ubuntu) + pyenv + venv + pip

[手順](https://qiita.com/tfukumori/items/c2997988acacd0da17d0)

- Windows上にWSL2でUbuntuをインストールし、Ubuntu上にPython環境を構築
- pyenvをインストールしてインタプリタのインストールと切り替え
- venv等で仮想環境を構築し、pipでパッケージ管理を行う
- wsl2の機能でUbuntu上のファイルをWindowsエクスプローラーで操作できる

---

#### Python + WSL2(Ubuntu) + pyenv + venv + pipコード例

```bash
pyenv shell 3.6.9
python -m venv .venv
source .venv\bin\activate
python --version
pip install -r requiremtns.txt 
```

💡 WSL2上のDockerからGPUを使用する実装も進んでいます（2021年1月31日時点でプレビュー版）。
　[待ってました CUDA on WSL 2 - Qiita](https://qiita.com/ksasaki/items/ee864abd74f95fea1efa)

---

# 導入する拡張機能

- Python(ms-python.python)
    - 以下も自動的にインストール
        - Pylance(ms-python.vscode-pylance)
            - Pyrightの後継。[PyrightのGithub](https://github.com/microsoft/pyright)でもPylanceの使用が推奨されている
        - Jupyter(ms-toolsai.jupyter)
- Visual Studio Intelicode(visualstudioexptteam.vscodeintellicode)
- Python Docstring Generator(njpwerner.autodocstring)
- GitLens(eamodio.gitlens)
- Git Graph(mhutchie.git-graph)
- TensorFlow Snippets(vahidk.tensorflow-snippets)
    - TensorFlowを利用した機械学習を行う場合

---

# 主な機能 

- [(1) インテリセンス](#(1)-インテリセンス)
- [(2) 仮想環境の自動切換え](#(2)-%E4%BB%AE%E6%83%B3%E7%92%B0%E5%A2%83%E3%81%AE%E5%88%87%E3%82%8A%E6%9B%BF%E3%81%88)
- [(3) Jupyter Notebooksのサポート (Jupyter Notebook UI)](#(3)-jupyter-notebooks%E3%81%AE%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88-(jupyter-notebook-ui))
- [(4) インタラクティブウインドウ (# %%)](#(4)-%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%83%96%E3%82%A6%E3%82%A4%E3%83%B3%E3%83%89%E3%82%A6-(%23-%25%25))
- [(5) コードの静的解析（リンター）](#(5)-コードの静的解析（リンター）)
- [(6) コード整形（フォーマッター）](#(6)-コード整形（フォーマッター）)
- [(7) デバッグ](#(7)-デバッグ)
- [(8) テスト](#(8)-テスト)
- [(9) リファクタリング](#(9)-リファクタリング)
- [(10) 関数の説明（Docstring）を自動生成](#(10)-%E9%96%A2%E6%95%B0%E3%81%AE%E8%AA%AC%E6%98%8E%EF%BC%88docstring%EF%BC%89%E3%82%92%E8%87%AA%E5%8B%95%E7%94%9F%E6%88%90)
- [(11) TensorFlow Snippets](#(11)-tensorflow-snippets)

---

## (1) インテリセンス

https://code.visualstudio.com/docs/python/editing#_autocomplete-and-intellisense

- オートコンプリート
- 定義の参照（`F12`）、その場で定義を参照（`ALT + F12`）
- 定義を使用している個所を参照（右クリックメニューから選択）
- importエラー時に該当するimportを挿入する
	[pylance](https://marketplace.visualstudio.com/items?itemName=ms-python.vscode-pylance)の機能。
- 必要に応じて型チェックを有効化することができる（`python.analysis.typeCheckingMode`）
	[pylance](https://marketplace.visualstudio.com/items?itemName=ms-python.vscode-pylance)の機能。[@simonritchie さんの記事](https://qiita.com/simonritchie/items/33ca57cdb5cb2a12ae16#%E5%9E%8B%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E3%82%92%E6%9C%89%E5%8A%B9%E5%8C%96%E3%81%99%E3%82%8B)も参照
	既定値は無効（off）
	プロジェクトに応じて型チェックの必要性は変わります。プロジェクトメンバーで協議し統一することが大事です。
	|設定値|動作|
	|---|---|
	|off|型チェックは行われない（未解決のインポート/変数診断に関するチェック）|
	|basic|offのルールに加えて基本的な型チェック（型アノテーションがしてある箇所で正しいかどうか）|
	|strict|off,basicに加えて厳格な型チェック（型アノテーションなどがしていない箇所自体もエラーになる）|

---

## (2) 仮想環境の切り替え  

https://code.visualstudio.com/docs/python/environments

プロジェクトフォルダ直下に仮想環境フォルダを作成することで、.pyファイルを開いたタイミングで仮想環境を自動認識して切り替わります。

💡 仮想環境フォルダ名には`.venv`が良く使われます。
💡 画面の左下で確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/bbaf5baa-863e-269c-9d62-38280277921b.png)

---

## (3) Jupyter Notebooksのサポート (Jupyter Notebook UI)

https://code.visualstudio.com/docs/python/jupyter-support

Jupyter NotebooksをVSCode上で行うことができます。

- VSCode上でJupyter NotebookのUIを実行できる
- 以下のコマンドでJupyter Notebookを作成できる
    `>Create New Blank Jupyter Notebook`
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/88d2763e-989d-d169-45dd-c058bbfa15a9.png)

### 実行サンプル

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/09c3eef7-68fd-a2d4-8a26-bbaa6383d428.png)

---

## (4) インタラクティブウインドウ (# %%)

https://code.visualstudio.com/docs/python/jupyter-support-py

誤解を恐れずに言うと、Jupyter Notebooksのような動きを.pyファイルで行うことができます。つまり逐次動作を確認しながら、.pyファイルを作成することができる機能となります。

- `.py`ファイルに、`# %%`を入力することで、PythonファイルをNotebookのようにセルを作って逐次実行することができる。
- "Shift + Enter "でセルが実行され、結果が表示される
- `# %%`はコメントなので`.py`ファイルの直接実行時には無視される

### 実行サンプル

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/c3985042-7583-5854-491c-13c4796f1e94.png)

---

## (5) コードの静的解析（リンター）

https://code.visualstudio.com/docs/python/linting

文法チェック、使用していない変数の確認などを行うことができます。

`Python: Select Linter`を実行して、コードの静的解析（リンター）を選択します。特に問題のない限り既定のPylintでよいと思われます（Flake8 なども選択できます）。

💡 VSCodeのPythonは、最も多くのPython開発者に対してわかりやすい一連の文法チェックを使用するように既定で構成されています。

選択したリンターがインストールされていない場合は、プロジェクトの仮想環境にリンターが自動でインストールされます。

### 実行サンプル

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/a918cceb-885a-73ae-1aa8-05c302ccedd9.png)

---

## (6) コード整形（フォーマッター）

https://code.visualstudio.com/docs/python/editing#_formatting

pip で black をインストールし、コード整形（フォーマッター）のProviderとして設定します。

整形の規約としては、autopep8, black, yapf の 3 種類あります。
black が一番厳しい規約のため仕事として行うならば black が望ましいと思われます。（誰でも同じような書式としてフォーマットされます。）

💡 "ALT + SHIFT + F"で整形できます。

### 手順

#### 方法1

1. .pyファイルを開いて、"ALT + SHIFT + F"を実行

1. ダイアログで"Use black"を選択

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/310f4860-cc30-44d9-a910-2c5c29ee6408.png)

#### 方法2

1. blackをpipでインストールする

    ```
    pip install black
    ```

1. 設定で有効にする

    設定で`python.formatting.provider`を検索し、`black`を設定
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/c5770460-f6ee-fbee-5f0a-a77862cf7571.png)

---

## (7) デバッグ

https://code.visualstudio.com/docs/python/debugging

アクティビティバーで実行ビューを選択し、構成の初期化とlaunch.jsonファイルの作成を行い、実行ビューから実行することでデバッグできます。

Django, Flusk, 単体.pyファイルの実行などの構成ファイル（launch.json）が用意されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/09bc8db1-a99e-c524-f873-7e851a5f4261.png)

### 手順（単体.pyファイル）

💡 引数が必要な場合などはlaunch.jsonファイルのカスタマイズが必要です。

1. デバッグする.pyファイルを開く

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/eed93fdc-af10-5f99-8fc2-4373a7ecf704.png)

1. アクティビティバーで実行ビューを選択し「実行とデバッグ」を実行

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/bcceaca4-212a-de71-7e33-17323b4634f3.png)

1. 「Python File」を選択

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/a7d6bbd1-4a37-2718-21de-f58e51263e2c.png)

1. デバッグできる

    **ブレークポイントで止まった時の例**
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/360fd3c7-d3bf-5ec8-d268-867b8d6e2ae1.png)

    **捕捉されなかった例外（Uncaught Exception）が発生したとき**
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/64a18df6-2361-4fd3-f620-6c7a8b61cfca.png)

### launch.jsonファイルのカスタマイズ例

現在のプロジェクトディレクトリ(`${workspaceFolder}`) で`main.py`ファイルを起動するために設定された Python インタプリタを使用する場合の例です。[args[]配列にコマンドライン引数を追加したり、env[] 配列を追加して環境変数を追加](https://go.microsoft.com/fwlink/?linkid=830387)することもできます。

```json
{
    // IntelliSense を使用して利用可能な属性を学べます。
    // 既存の属性の説明をホバーして表示します。
    // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",  
    "configurations": [  
        {  
            "name": "Python: tornado",  
            "type": "python",  
            "request": "launch",  
            "program": "${workspaceFolder}/main.py",  
            "args": [],  
            "console": "integratedTerminal"  
        }  
    ]  
}
```

---

## (8) テスト

https://code.visualstudio.com/docs/python/testing

Python 組み込みの unittest、または pytest を使用したテストをサポートしています。

テストが検出されると、アクティビティバーのテストエクスプローラーアイコンも表示されます。テストエクスプローラーで、テストを視覚化、移動、および実行することができます。

### 手順

1. F1キーからコマンドで`Python: Discover Tests`を実行

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/9a501660-fd55-cb0a-218a-acde3683e624.png)

1. フレームワーク有効確認のダイアログが表示されるので選択

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/14a31f88-ff65-fb7c-8b5d-2b519c288a11.png)

1. 使用するフレームワークを選択（基本的には`unittest`でOK）

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/b5e0177f-e4d1-588e-66e7-70872ed1bf52.png)

1. テストコードが保存されたフォルダを選択

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/577c3a58-c056-f0ae-a938-ad1b828323ab.png)

1. テストコードファイルのファイル名パターンを指定

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/b14de33d-18e8-db00-3d02-1bd92d65c39f.png)

1. アクティビティバーのテストエクスプローラーにテストが表示される

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/932748a6-98b8-bf5e-ab5c-8693efff57ff.png)

1. すべての単体テストを実行

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/3128a2f7-4a32-7013-e6ea-51aae9e7ed23.png)

1. 単体テストの出力を表示

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/3648837a-8ac6-ac3d-9bf5-8f1698e4e95d.png)

    ```
    start
    test_unittest.Test_TestIncrementDecrement.test_decrement
    test_unittest.Test_TestIncrementDecrement.test_increment
    test_decrement (test_unittest.Test_TestIncrementDecrement) ... FAIL
    NoneType: None
    test_increment (test_unittest.Test_TestIncrementDecrement) ... ok
    
    ======================================================================
    FAIL: test_decrement (test_unittest.Test_TestIncrementDecrement)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "c:\Users\fukumori\source\repos\pythontest\test_unittest.py", line 10, in test_decrement
        self.assertEqual(inc_dec.decrement(3), 4)
    AssertionError: 2 != 4
    
    ----------------------------------------------------------------------
    Ran 2 tests in 0.000s
    
    FAILED (failures=1)
    ```
1. 「Deubg Test」からデバッグを行う

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/0080b75a-f455-04c7-ed4e-936a12bd2e96.png)

---

## (9) リファクタリング

https://code.visualstudio.com/docs/python/editing#_refactoring

PyCharm に比べると種類は少ないですがリファクタリングがサポートされています。

- 変数の抽出
	選択したテキストの類似したすべての出現箇所を抽出し、変数に置き換える
- メソッドの抽出
	選択した式またはブロックの類似したすべての出現箇所を抽出し、メソッド呼び出しに置き換える
- インポートの並べ替え
	**同じモジュールからの特定のインポート**を 1 つのステートメントに統合し、ステートメントをアルファベット順に整理する

---

## (10) 関数の説明（Docstring）を自動生成

https://marketplace.visualstudio.com/items?itemName=njpwerner.autodocstring

関数定義に[Docstring](https://www.python.org/dev/peps/pep-0287/)を記載するとVSCodeのコーディング中に関数の説明が表示されます。

Docstringの書式統一のためにも、Docstringの記載をある程度自動化する手順を紹介します。

![](https://github.com/NilsJPWerner/autoDocstring/raw/master/images/demo.gif)
引用元：https://marketplace.visualstudio.com/items?itemName=njpwerner.autodocstring

### 手順

1. 関数宣言の直下で`"""`を入力するとGenerate docstringという入力支援が表示されます。
2. 選択またはEnterでDocstringが自動的に挿入されます。引数が指定されている場合は引数名も自動挿入されます。

---

## (11) TensorFlow Snippets

https://marketplace.visualstudio.com/items?itemName=vahidk.tensorflow-snippets

Visual Studio CodeでTensorFlowモデルを開発する際に有用なSnippetsとなります。

下記画像にあるように、tensorboardも含めた基本的な学習用スクリプト作成を効率的に行うことができます。

![](https://github.com/vahidk/tensorflow-snippets/raw/master/images/framework.gif)
引用元：https://marketplace.visualstudio.com/items?itemName=vahidk.tensorflow-snippets

---

# PyCharm

稟議を通せるなら有償のパッケージを購入することもお勧めです。

- [最強のPython統合開発環境PyCharm - Qiita](https://qiita.com/yamionp/items/f88d50da8d6b548fc44c)
    - ファイルエンコーディング記述
    - コード解析
    - ⚡ Template内のステップ実行でのデバッグも可能！

---

# 参考資料

- [[Python]PylanceのVS Code拡張機能をさっそく使ってみた。 - Qiita](https://qiita.com/simonritchie/items/33ca57cdb5cb2a12ae16)
- [Pythonで使えるリファクタリングツールたち - Qiita](https://qiita.com/Alice1017/items/81d75640febcdfa9cfd9)
- [リファクタリングツールあれこれ — pyconjp2014 1 documentation](http://tell-k.github.io/pyconjp2014/)
- [自動テスターなら入れておきたい！Visual Studio Codeオススメ拡張21選 (2020年8月版) - Qiita](https://qiita.com/yaboxi_/items/2dbb72fb3c8cbe17c812)
- [Python - Wikipedia](https://ja.wikipedia.org/wiki/Python)
    - バージョン、サポート期限等
- [中級者へのModern Python](https://zenn.dev/ganariya/articles/intermediate-python)
- [Python オレオレ、コレだけはやっておけ 2021 - Qiita](https://qiita.com/shoot16625/items/9eefc6e81b3cf209729b)
- [nao's blog – Pipenv をやめて venv を使いだした話](https://blog.uedder.com/2020_python_develop_envirionment.html)
- [python - What is pyproject.toml? - Stack Overflow](https://stackoverflow.com/questions/62983756/what-is-pyproject-toml)
- [【2020年新人研修資料】ナウでヤングなPython開発入門 - Speaker Deck](https://speakerdeck.com/stakaya/2020nian-xin-ren-yan-xiu-zi-liao-nauteyankunapythonkai-fa-ru-men)
- [VSCode拡張機能「Python Docstring Generator」でPythonのdocstringを自動生成しよう | DevelopersIO](https://dev.classmethod.jp/articles/vscode_extension_python_docstring_generator/)