始めに
複数人数でPythonを用いた小規模開発をすることになりました。
今まではデータ集計/分析のために一人でPythonを用いていただけなので、Python/ライブラリバージョン、書き方の統一について意識していませんでした。
ということで、上記事項について調べて実行してみました。
PC環境
- OS : Windows 10 Home 64bit
- WSL2 : Ubuntu 20.04
- IDE : VSCode
VSCodeを用いてWSL2上のUbuntu 20.04でPython3を使った開発を行うことを目指します。
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
ライブラリバージョン
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
ファイルが作成されます。
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のトラッキングからは除外されます。
フォーマッター
- 参考にしたページ
black,isort
インストール
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のチェックを走らせてしまった図(とても時間掛かります)
VSCode settings.json設定
VSCodeのsettings.jsonを以下のように編集します。
後述しますRemote-WSLのsettings.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.formatOnSave
とeditor.codeActionsOnSave
の項目がisortについての保存時にisortを自動実行する設定です。
CI
CIツールとしてGithub Actionsを使い、特定のブランチへのPUSH時にチェックが入るようにします。
Github Actions
.github/workflows/
にymlファイルを作りGithub Actionsの内容を記載します。
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
についてはこちらのページを参考に調べました
チェック内容としては以下
- isortによるチェック
- blackによるチェック
-
—check
でblackによるフォーマットチェックを書けた場合どうなるのかを判断- 0が返ってきた場合何も変更する場所はない
- 1が返ってきた場合再フォーマットされる場所がある
- 123は内部エラー
-
- pflake8によるチェック
- pflakeを呼び出す
- 警告一覧はこちら
mainブランチへのプッシュを実行したところ、きちんと走らせることができました
blackのフォーマットチェックが問題ない場合、ケーキが出てくるのがかわいい
Template Repository
- 参考にしたページ
Githubでリポジトリを立てる際のテンプレートを作ることができます。
1.対象のリポジトリの「Settings」→「Template repository」にチェック
2.Create a new repositoryで「Repository template」からテンプレートを選択
最初からコーディングのチェック環境が整ったリポジトリで作業を始められます。
VSCode
ターミナル
Remote-WSL
VSCodeの拡張機能「Remote-WSL」を使います。
Remote-WSLを入れると
2.WSL2のpoetry仮想環境をインタープリターから選択できるようになる
※左下の環境が「WSL: Ubuntu-20.04」になっていることを確認したうえで、「インタープリターを選択」をチェックするとWSL2のpoetryの環境が選択できるようになります。
(左下の環境)
この設定は重要で、行わないと
- VSCode settings.json設定で施したblackの保存時フォーマット変更がされない
-
flake8での適切なリンターがされない
- poetry環境ではインストールしているのに、選択したインタープリターではインストールしていないライブラリについて「reportMissingImports」が出てくる
以上のような状態になってしまいます。
ちなみに、Remote-WSLを入れずに、Windows側から「インタープリターを選択」をすると、
exeファイルのpythonしか選択肢に出てこないので、WSL2上のpython環境を読めません。
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さんからの指導と自分自身の探索を纏めて記事にさせて頂きました。
本当にありがとうございます
今回作成した環境をGithubリポジトリにしています。
https://github.com/nijigen-plot/python_repository_template
もしよければ見てもらえると嬉しいです。