3
Help us understand the problem. What are the problem?
Organization

チームでの開発環境を整える

始めに

複数人数でPythonを用いた小規模開発をすることになりました。
今まではデータ集計/分析のために一人でPythonを用いていただけなので、Python/ライブラリバージョン、書き方の統一について意識していませんでした。
ということで、上記事項について調べて実行してみました。

PC環境

  • OS : Windows 10 Home 64bit
  • WSL2 : Ubuntu 20.04
  • IDE : VSCode

VSCodeを用いてWSL2上のUbuntu 20.04Python3を使った開発を行うことを目指します。

Pythonバージョン

pyenvであらゆるPythonバージョンへ切り替えられるように設定します。

pyenv導入

まず初めに正常なビルド環境の為の推奨コマンドを実行

sudo apt-get update ; sudo apt-get install make build-essential libssl-dev zlib1g-dev \
libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm \
libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev

インストール

インストールしたいディレクトリでコマンドを実行(ホームディレクトリ直下が好ましいとのこと)

git clone https://github.com/pyenv/pyenv.git ~/.pyenv

以下を実行するとpyenvを高速化できるみたいです。

cd ~/.pyenv && src/configure && make -C src

次に以下のコマンドを実行

echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init --path)"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc

再起動してpienv -v

pyenv 2.2.5-11-gf0f2cdd1

バージョンが表示されたらOK

Pythonバージョンインストール

3.7.12と3.9.11を入れてみます。

pyenv install 3.9.11
pyenv install 3.7.12

pyenvで使用できるpythonのバージョン一覧を見る

pyenv versions

pyenvで使用するpythonのバージョンを選択する

pyenv local 3.9.11

SnapCrab_NoName_2022-4-16_13-37-41_No-00.png
切り替えできました

ライブラリバージョン

poetryでPythonライブラリのバージョンを管理します。

poetry導入

インストール

公式マニュアル

以下のコマンドを実行してインストール

curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python -

再起動してpoetry —version

Poetry version 1.1.13

プロジェクトの設定

公式マニュアル

プロジェクトのディレクトリ下で、poetry.tomlを作成する為以下のコマンドを打ちます。

poetry init

途中、バージョン・説明・著者・ライセンス・適応したPythonバージョンを記載できます。

Version [0.1.0]:  
Description []:  
Author [None, n to skip]: 
License []:  
Compatible Python versions [^3.9]: 

「ライブラリに関する依存関係について、今定義したいですか?」

Would you like to define your main dependencies interactively? (yes/no) [yes] 

「開発用ライブラリに関する依存関係について、今定義したいですか?」

Would you like to define your development dependencies interactively? (yes/no) [yes]

「記入した内容で作成しますが良いですか?」

Do you confirm generation? (yes/no) [yes]

yesを押すとpyproject.tomlファイルが作成されます。

SnapCrab_NoName_2022-4-16_14-25-43_No-00.png

poetry addでpyproject.tomlに要求したパッケージを追加し、インストールできます。

poetry add tweepy

その他コマンドについてはこちら

仮想環境ディレクトリ設定

poetryの仮想環境をプロジェクトディレクトリ直下に作成するように設定を変更します。

まずはプロジェクトディレクトリから以下を打ち込み環境名をチェック

poetry env list

次に以下のコマンドを打ち込む

poetry config virtualenvs.in-project true --local

「環境名」にpoetry env listで出てきた環境名を打ち込んで実行

poetry env remove 環境名

再度環境をインストール

poetry install

すると、プロジェクトディレクトリ直下に仮想環境データが置かれるようになります。
.gitignoreファイルも自動で作られるため、Gitのトラッキングからは除外されます。

SnapCrab_NoName_2022-4-17_20-16-0_No-00.png

フォーマッター

black,isort

blackisortを使ってみます

インストール

poetry add black
poetry add isort

pyproject.toml設定

1行の最大文字数設定を88から119へ変更したいので設定します。
blackとisortを同じく使う時は、競合を避けるためpyproject.tomlにprofile = “black”と記入します。

[tool.black]
line-length = 119

[tool.isort]
profile = "black"

リンター

flake8

flake8を使ってみます。
flake8の設定をpyproject.tomlへ統合するにはpyproject-flake8を使うと良いみたいです。

インストール

-Dコマンドで開発用の依存関係としてパッケージを追加します。

poetry add -D pyproject-flake8

pyproject.toml設定

blackとflake8を使う場合は、以下のように設定します。

  • max-line-lengthはblackのline-lengthと合わせる
  • exclude = “.venv”
    • poetryの仮想環境データの内容はチェックしないようにするため。
[tool.flake8]
max-line-length = 119
extend-ignore = E203
exclude = ".venv"

exclude = “.venv”にチェックを入れずにGithub Actionsでflake8のチェックを走らせてしまった図(とても時間掛かります)
SnapCrab_NoName_2022-4-17_16-22-44_No-00.png

VSCode settings.json設定

VSCodeのsettings.jsonを以下のように編集します。
後述しますRemote-WSLのsettings.jsonが対象です。

SnapCrab_NoName_2022-4-17_20-2-37_No-00.png

json
{
    "python.linting.enabled": true,
    "python.linting.pylintEnabled": false,
    "python.linting.flake8Enabled": true,
    "python.linting.lintOnSave": true,
    "python.formatting.provider": "black",
    "python.formatting.blackArgs": [
        "--line-length",
        "119"
    ],
    "editor.formatOnSave": true,
    "editor.codeActionsOnSave": {
        "source.organizeImports": true
    }
}

isortについてはVS Codeの標準のimport並べ替え用パッケージとして組み込まれているとの事です。
editor.formatOnSaveeditor.codeActionsOnSaveの項目がisortについての保存時にisortを自動実行する設定です。

CI

CIツールとしてGithub Actionsを使い、特定のブランチへのPUSH時にチェックが入るようにします。

Github Actions

公式マニュアル

.github/workflows/にymlファイルを作りGithub Actionsの内容を記載します。

yml
name: プッシュ時フォーマットチェック
on:
  push:
    branches:
      - main
  pull_request:
    types: [opened, reopened, synchronize]

jobs:
  format-check:
    runs-on: ubuntu-20.04
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-python@v3
        with:
          python-version: '3.9'
      - run: pip install poetry
      - run: poetry install
      - run: poetry run isort . --check-only
      - run: poetry run black . --check
      - run: poetry run pflake8
      - run: poetry run python -m py_compile main.py

チェックが入る条件としては以下です。

  • mainブランチへのプッシュ時
  • プルリクエストを発行した時
  • クローズされたプルリクエストが再度オープンした時
  • プルリクエストを発行したプルされる側のブランチに対するプッシュをした時

types: synchronizeについてはこちらのページを参考に調べました

チェック内容としては以下

mainブランチへのプッシュを実行したところ、きちんと走らせることができました
SnapCrab_NoName_2022-4-17_20-32-29_No-00.png

blackのフォーマットチェックが問題ない場合、ケーキが出てくるのがかわいい

SnapCrab_NoName_2022-4-17_20-33-35_No-00.png

Template Repository

Githubでリポジトリを立てる際のテンプレートを作ることができます。

1.対象のリポジトリの「Settings」→「Template repository」にチェック
SnapCrab_NoName_2022-4-20_22-49-39_No-00.png
2.Create a new repositoryで「Repository template」からテンプレートを選択

SnapCrab_NoName_2022-4-20_22-51-34_No-00.png

最初からコーディングのチェック環境が整ったリポジトリで作業を始められます。

SnapCrab_NoName_2022-4-20_22-53-44_No-00.png

VSCode

ターミナル

Remote-WSL

VSCodeの拡張機能「Remote-WSL」を使います。

Remote-WSLを入れると

1.ターミナルでWSL2を開くことができるようになる
SnapCrab_NoName_2022-4-17_13-46-52_No-00.png

2.WSL2のpoetry仮想環境をインタープリターから選択できるようになる
※左下の環境が「WSL: Ubuntu-20.04」になっていることを確認したうえで、「インタープリターを選択」をチェックするとWSL2のpoetryの環境が選択できるようになります。
SnapCrab_NoName_2022-4-17_20-22-16_No-00.png
(左下の環境)
SnapCrab_NoName_2022-4-20_23-33-4_No-00.png

この設定は重要で、行わないと

  • VSCode settings.json設定で施したblackの保存時フォーマット変更がされない
  • flake8での適切なリンターがされない
    • poetry環境ではインストールしているのに、選択したインタープリターではインストールしていないライブラリについて「reportMissingImports」が出てくる

以上のような状態になってしまいます。

ちなみに、Remote-WSLを入れずに、Windows側から「インタープリターを選択」をすると、
exeファイルのpythonしか選択肢に出てこないので、WSL2上のpython環境を読めません。
SnapCrab_NoName_2022-4-17_14-54-12_No-00.png

WSL2からVSCode起動

WSL2コンソールから

code .

と打つと、最初からUbuntu20.04とリモート接続した状態でVSCodeを起動できます

ですが、特に設定していないと、Command 'code' not foundと出てしまうので、
Windows側のVSCodeのパスをWSL2の.barhrcに記載する必要があります。

デフォルトのVSCodeインストールパスは
C:\Users\[ユーザ名]\AppData\Local\Programs\Microsoft VS Code\bin
このようになっていると思うので、これを追加してパスを通します。

WSL2のホームディレクトリへ移動して.bashrcを開きます

cd ~
vim .bashrc

「i」ボタンをおして編集モードにして

export PATH=$PATH:'/mnt/c/Users/[ユーザ名]/AppData/Local/Programs/Microsoft VS Code/bin'

と記載し、Esc:wqで保存して閉じる

と、code .でWSL2リモート接続状態のVSCodeを開くことができます。

さいごに

セットアップ大変だなと思いました・・・一度やれば次は楽なので、頑張って覚えていこうと思います。
今後は一人でもこれらを意識していきます。

今回は、@tfandkusuさんからの指導と自分自身の探索を纏めて記事にさせて頂きました。
本当にありがとうございます :bow:

今回作成した環境をGithubリポジトリにしています。
https://github.com/nijigen-plot/python_repository_template
もしよければ見てもらえると嬉しいです。

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
3
Help us understand the problem. What are the problem?