チームにおける円滑なPython開発環境 [Poetry + pyenv + black + isort]

# チームにおける円滑なPython開発環境 [Poetry + pyenv + black + isort]

チームで開発環境を統一できると共同作業が格段に楽になります．この記事では[poetry](https://python-poetry.org/) + [pyenv](https://github.com/pyenv/pyenv)により仮想環境を統一し，[black](https://github.com/psf/black) + [isort](https://github.com/timothycrosley/isort)によってコードの自動フォーマットを設定します．

## Editor

好きなものを使用してください．vimでもpycharmでもVScodeでも．ここではVScode前提で設定を記します．

- VSCode

vscodeのインストール方法は以下

- Mac: [MacOSでVisual Studio Codeをインストールする手順](https://qiita.com/watamura/items/51c70fbb848e5f956fd6)
- ubuntu: [簡単にUbuntuにVSCode (Visual Studio Code) をインストールする方法](https://www.karelie.net/install-vscode-ubuntu/)

## 仮想環境

仮想環境を使用することでチームでコードを書く際に実行環境を揃えることができ，共同作業の効率がぐんと上がります．ここでは以下の仮想環境ツールを使用します．

- pyenv
- poetry

インストール方法は[この記事](https://qiita.com/MasashiSD/items/a22a6f352b37e2316367#%E4%BB%AE%E6%83%B3%E7%92%B0%E5%A2%83%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)を参照してください．

### pyenvを使用して使用するPythonをインストールする．

以下のコマンドで使用できるPythonのバージョンをリストアップできます．

```sh
pyenv install --list
```

今回はPython 3.7を導入することにしましょう．

```sh
pyenv install 3.7
```

pyenvの詳しい使用方法は[この記事](https://qiita.com/koooooo/items/b21d87ffe2b56d0c589b)を参照してください．

### poetryによる新規プロジェクトの作成

プロジェクトを新規作成する場合，以下を実行します．仮想環境をプロジェクトのディレクトリ直下に置くために`poetry config virtualenvs.in-project true`を同時に実行します．(VSCodeを正しく動かすために必要)

```sh
poetry config virtualenvs.in-project true
poetry new new_project
```

### pyproject.tomlの設定

すると，プロジェクト内に`pyproject.toml`というファイルが生成されます．このファイルが設定ファイルとなり，今後編集していくものとなります．前の項でインストールしたPythonのバージョンを指定してみましょう．以下のように記述することでPython 3.7系を使用することを明記できます．

```toml
[tool.poetry.dependencies]
python = "^3.7"
```

### 仮想環境の構築

その後，以下のコマンドでPythonの仮想環境を構築，インストールすることができます．

```sh
poetry install
```

### ライブラリのインストール

この仮想環境内に新しいライブラリをインストールしたい場合は以下のように`add` optionを指定する．ここでは`black`, `isort`, `flake8`, `mypy`を開発用(`-D` option)でインストールしてみましょう．

```sh
poetry add flake8 -D
poetry add black -D
poetry add isort -D
poetry add mypy -D
```

### 仮想環境内での実行

仮想環境内で実行したい場合，プログラムを仮に`your_program.py`と置くと以下で実行できる．

```sh
poetry run python your_program.py
```

### 仮想環境内でのシェルの実行

また，仮想環境内でシェルを実行したい場合は以下を打つことで，シェルが起動する．

```sh
poetry shell
```

### 既存プロジェクトへのpoetryの導入

すでにプロジェクト`your_project`が存在する場合，以下を実行します．仮想環境をプロジェクトのディレクトリ直下に置くために`poetry config virtualenvs.in-project true`を実行します．(VSCodeを正しく動かすために必要)

```sh
cd your_project
poetry config virtualenvs.in-project true
poetry init
poetry install
```

initをするときにtestなどのディレクトリを作成されたくない場合は以下の`--no-interaction`のoptionを指定してください．

```sh
poetry init --no-interaction
```

### poetryの詳細な使用方法

詳細な使用方法は「[公式document (英語)](https://python-poetry.org/docs/basic-usage/)」か「[この記事: Poetry: Python の依存関係管理とパッケージングを支援するツール](https://org-technology.com/posts/python-poetry.html)」，「[この記事: Poetryを使ったPythonパッケージ開発からPyPI公開まで](https://kk6.hateblo.jp/entry/2018/12/20/124151)」を参照してください．

### VSCodeでpoetryで作成した仮想環境のPythonをinterpreterとして使用

作成したプロジェクトをVSCodeで開きます．適当なPythonファイルを作成 or 選択し，左下の `select interpreter`を押し，`.venv`内のPythonを選択します．

## Python formatterの導入

チームでコードを書く際に書き方が統一されていると，コードが読みやすくなり，円滑にコーディングが進みます．ここではblackで自動でコードをフォーマットし，isortでimport文の順序を揃えることで，自動的に書き方が統一されるようにします．上のpoetryを導入した前提でFormatterの導入方法を記します．(VSCode用)

### black

- install

  - `poetry add black -D`
  - `poetry add flake8 -D`

- VSCodeの設定をします．　`ctrl + ,`で設定画面を表示できるため以下のように設定します．以下の設定によってsaveするたびにコードをフォーマットしてくれます．

| 設定名                       | 機能                                 | 設定値 |
| ---------------------------- | ------------------------------------ | ------ |
| python.linting.enabled       | Lint機能を有効にするかどうか         | true   |
| python.linting.pylintEnabled | Linterにpylintを使用するかどうか     | false  |
| python.linting.flake8Enabled | Linterにflake8を使用するかどうか     | true   |
| python.linting.lintOnSave    | ファイル保存時にLintを実行するか     | true   |
| python.formatting.provider   | Pythonコードの整形に何を使用するか   | black  |
| editor.formatOnSave          | ファイル保存時に自動整形するかどうか | true   |

- 参考: [Blackできれいに自動整形！flake8とBlack導入と実行/VSCodeの設定](https://qiita.com/tsu_0514/items/2d52c7bf79cd62d4af4a#vscode%E3%81%AE%E8%A8%AD%E5%AE%9A)

### isort

- install

  `poetry add isort -D`

- 保存時に自動でimport文の順序を揃えてくれるようにvscodeの設定をします．
  - VSCode上で`ctrl + shift + p` を打つことでコマンド画面を出します．
  - `Preferences: Open Settings (JSON)`と打ち，setting.jsonを表示します．
  - 以下を追記します．

    ```json
    {
      "[python]":{
        "editor.codeActionsOnSave":{
           "source.organizeImports":true
        }
    }
    ```

## 参考リンク

- [Poetryを使ったPythonパッケージ開発からPyPI公開まで](https://kk6.hateblo.jp/entry/2018/12/20/124151)
- [Setup Black and Isort in VSCode](https://medium.com/@cereblanco/setup-black-and-isort-in-vscode-514804590bf9)