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にある。