こんにちは。 技術本部 研究開発部の高橋寛治です。
Python でプロジェクトを始める際に、ディレクトリ構成を考えたり、パッケージ方法を考えたり、もしくは何か参考になるものを見つけてコピペしたり、と意外と時間をかけていました。
これをコマンド一つで解決する Cookiecutter および社内での活用事例を紹介します。
Cookiecutterとは
Cookiecutter とは、プロジェクトテンプレートからプロジェクトを作成してくれるコマンドラインツールです。 ここでのプロジェクトとは、ディレクトリとファイルおよびそれらの命名や記述されている項目を指します。
Cookiecutter には次の2つの側面があります。一つはプロジェクトテンプレートを利用すること、もう一つはプロジェクトテンプレートを作成することです。
インストール
Cookiecutter は Python で書かれたライブラリです。 システムの Python に相当するものにインストールします。 これにより、プロジェクト作成時に利用可能となります。 また、プロジェクト内の Python 仮想環境は汚しません。
インストールは、 pip install cookiecutter
を実行するだけです。
プロジェクトテンプレートの利用
利用方法はシンプルです。 以下に示すように、利用したいテンプレートを引数で指定するだけです。
cookiecutter https://github.com/audreyfeldroy/cookiecutter-pypackage
この場合は、https://github.com/audreyfeldroy/cookiecutter-pypackage
で公開されているテンプレートを利用してプロジェクトを作成します。
実行すると、対話形式で必要な項目について入力を求められます。
入力が終わると、プロジェクトが作成されます。
プロジェクトテンプレートの作成
公式リファレンスで書かれているようにシンプルです。
覚えておくことは、次の点くらいかと思います。 あとは、見よう見まねで作れます。
- 設定ファイル
cookiecutter.json
で変数を定義する - 変数は、
{{cookiecutter.変数名}}
という形式で記述する - 変数は、ディレクトリ名やファイル中の該当する表記に対して自動で展開される
- テンプレートのディレクトリ(例
{{cookiecutter.project_name}}
)を作成しその中に作って行く
Cookiecutterの利用例の紹介
gokart を利用する機械学習プロジェクトにおいて Cookiecutter を利用しています。
エムスリーさんの Cookiecutter を利用させていただいていましたが、社内のコーディング規約を始めとした事情に合わせるために、内向きのものを作成しました。
結果として、プロジェクト開始時の作業時間が削減されたことと、プロジェクト構成やパッケージの強制力が増しレビューが楽になりました。
まず、プロジェクト開始時の作業時間の削減は、言わずもがなコマンド一つと対話に答えるだけですので、1分もかかりません。 自前で作ったり、コピペをしたりしていると慣れていても10分以上はかかっていたと思います(測っていないですが、1分で終わるようなものでは無かったです)。 慣れていないとなおさら何から始めていいかわからないので、余計に時間がかかります。 例えば、わかる人に聞くとなると、二人分の時間がかさみます。
次に、プロジェクト構成やパッケージの強制力が増して、レビューが楽になった点です。 仕組みがないと、プロジェクト構成や利用パッケージについては、ある程度揺らいでしまうものです。 これが統一されることで、見るべき箇所がわかりやすくなりますし、そもそも構成についての指摘が減ります。 構成については、そもそものテンプレート作成時にレビューされているためです。 GitHub上で管理されているレビューされたテンプレートということは結構重要かと思います。
また、gokart以外にもfastapiのテンプレートも作って活用されています。
以前のブログ記事執筆時にも実は使っています。 本当にあっという間にディレクトリ構成ができるので助かります。
楽できるところは楽をする
プログラムを書くことを生業としている身としては、定型作業の効率化や自動化はやっていかねばと思います。 今回のテンプレートは、ライブラリのようなもので、Pythonプロジェクトに知見のある人が作ったテンプレートにより、誰でもスタートラインを前にして進めることができるようになります。
執筆者プロフィール
高橋寛治 Sansan株式会社 技術本部 研究開発部 Data Analysisグループ
阿南工業高等専門学校卒業後に、長岡技術科学大学に編入学。同大学大学院電気電子情報工学専攻修了。在学中は、自然言語処理の研究に取り組み、解析ツールの開発や機械翻訳に関連する研究を行う。大学院を卒業後、2017年にSansan株式会社に入社。キーワード抽出など自然言語処理を生かした研究に取り組む。
▼執筆者による連載記事はこちら