Pythonプロジェクトの始め方
Pythonのプロジェクトを始める方法をメモしておく。
方針
- 他の実行環境でもすぐに結果を再現しやすいこと
- プログラムの整形をcommit時に自動で行う
- テストが簡単にできる
パッケージ管理
pipenv install --python 3.6
pipenv
を使う。pyenv-virtualenv
を使ってきたがパッケージの依存関係を保存してくれるのでnpmのようにpipenv install
で環境がすぐに再現できるので便利。またPipfile
にスクリプトを登録しておくこともできるのでテストの実行スクリプトもまとめて記述することができる。ただし、パッケージの依存関係が複雑になった場合にlockファイルの解決に非常に時間がかかる。そのような場合はvirtualenvにしてセットアップ手順をシェルスクリプトで書くかdockerにしてしまったほうが良いかもしれない。
ソースコードの整形
pipenv install autopep8 --dev
autopep8
でコードの自動整形を行う。手動で行う場合にはPipfile
の[scripts]
にコマンドを書けばよい。たとえば以下のようになる。
[scripts]
fix = "autopep8 -vir ."
プロジェクトをgitで管理している場合には汚い状態のコードをpushしないように自動で整形してほしいこともある。マニュアルで.git/hooks
にスクリプトを足してもよいが、このスクリプト自体もバージョン管理したいのでpython-githooks
を使うことにする。このパッケージは.githooks.ini
ファイルに書かれたhookをgithooks
追加してくれる。たとえばコミット時に整形をしたいばあいはこのようにすれば良い。
[pre-commit]
command = pipenv run autopep8 -vir .
このファイルを追加した後(あるいは変更があった場合も含む)にpipenv run githooks
を叩けばhookの登録をしてくれる。このコマンドも忘れがちなのでPipfile
に書いてしまおう。
[scripts]
init = "githooks"
fix = "autopep8 -vir ."
テスト環境
pytest
を使う。
pipenv install pytest --dev
tests
ディレクトリを作ってその下にtest_*.py
を書けばその中の関数test_*()
を実行してくれる。実行はpipenv run pytest
で可能だが、これもスクリプトとして登録しておこう:
[scripts]
test = "pytest"
init = "githooks"
fix = "autopep8 -vir ."
pushする前にテストを走らせておくようにする場合には.githooks.ini
ファイルに以下のように書けばよい:
[pre-push]
command = pipenv run pytest
これでパッケージ管理、自動整形、自動テストが行えるようになった。一通り設定されたプロジェクトのサンプルはhttps://github.com/kzmssk/sample_python_projectにある。