いずみこんな悩みを解決できる記事を書きました!
僕は現役フリーランスエンジニア(歴10年)で、資格は13個保有しています。
「PythonでCLIツールを作りたい」とお考えではありませんか?
自作スクリプトに引数やオプションを付けて、コマンドとして使いたいと考えている方へ。
Typerを使えば、型ヒントを書くだけで引数解析とヘルプ表示が自動生成されます。



argparseより短く書けて、見た目もきれいです。
ということで、本記事ではPythonのTyperでCLIツールを作る方法を解説します。



すぐ読み終わるので、ぜひ最後まで読んでくださいませ。
| 【当サイト】おすすめフリーランスエージェント3選 | |||
|---|---|---|---|
| エージェント | 評価 | ポイント | 公式サイト |
レバテックフリーランス | 5.0 | 業界最大級のエージェント。 高単価案件が豊富。 | 公式 |
Midworks | 4.8 | 満足度調査で 3年連続3冠を達成。 | 公式 |
ITプロパートナーズ | 4.6 | 週2〜3向けの案件が豊富。 | 公式 |
【Python】TyperでCLIツールを作る方法
早速ですが、PythonのTyperでCLIツールを作る手順を解説します。
Typerとは
Typerは、Pythonの型ヒントをもとにコマンドライン引数を組み立てるCLIフレームワークです。
作者はWebフレームワークのFastAPIと同じ人物で、内部はClickというライブラリの上に構築されています。
関数の引数に型注釈を付けるだけで、引数のパース・型変換・ヘルプ表示・入力チェックまで自動で用意されます。



「関数を書く → CLIになる」という感覚で使えます。
Typerをインストールする
pipでインストールします。
pip install typer現在のTyperはターミナル表示を整えるrichライブラリを同梱しており、色付きの出力やきれいなヘルプがそのまま使えます。
最小構成のCLIを作る
まずは引数を1つ受け取るだけのCLIを作ってみます。
main.pyという名前で以下のコードを保存します。
import typer
def main(name: str):
typer.echo(f"Hello {name}")
if __name__ == "__main__":
typer.run(main)typer.runに関数を渡すと、関数の引数がそのままCLIの引数になります。
python main.py Izumi「Hello Izumi」と表示されれば成功です。
引数なしで実行するとエラーメッセージと使い方が表示され、–helpでヘルプが確認できます。



引数チェックとヘルプを自分で書かなくていいのが楽です。
引数とオプションを追加する
複数のサブコマンドを持たせる場合は、typer.Typerでアプリを作り、@app.commandで関数を登録します。
引数の説明やフラグ名を指定したいときは、Annotatedの中にtyper.Argumentやtyper.Optionを書きます。
from typing import Annotated
import typer
app = typer.Typer(help="ファイル操作用のCLIツール")
@app.command()
def greet(
name: str,
formal: Annotated[bool, typer.Option(help="丁寧な挨拶にする")] = False,
):
"""指定した名前に挨拶する"""
if formal:
typer.echo(f"はじめまして、{name}さん")
else:
typer.echo(f"やあ {name}")
@app.command()
def count(
path: Annotated[str, typer.Argument(help="対象ディレクトリ")] = ".",
):
"""ディレクトリ内のファイル数を数える"""
import os
entries = os.listdir(path)
files = [f for f in entries if os.path.isfile(os.path.join(path, f))]
typer.echo(f"{len(files)} 個のファイルがあります")
if __name__ == "__main__":
app()デフォルト値のない引数は必須の位置引数、デフォルト値を持つboolはフラグとして扱われます。
実行例は以下の通りです。
python main.py greet Izumi --formal
python main.py count ./srcboolのオプションは–formalと–no-formalの両方が自動で用意されます。



型をintにすれば数値変換、Pathにすればパスとして受け取れます。
エラー処理と確認プロンプトを入れる
処理を中断したいときはtyper.Exitを投げ、終了コードを指定します。
実行前に確認を取りたいときはtyper.confirmを使い、abort=Trueで拒否時に中断します。
import os
@app.command()
def delete(
path: str,
force: Annotated[bool, typer.Option("--force", "-f", help="確認せず削除する")] = False,
):
"""ファイルを削除する"""
if not os.path.exists(path):
typer.secho(f"{path} が見つかりません", fg=typer.colors.RED)
raise typer.Exit(code=1)
if not force:
typer.confirm(f"{path} を削除しますか?", abort=True)
os.remove(path)
typer.secho("削除しました", fg=typer.colors.GREEN)typer.Option("–force", "-f")のように書くと、短縮フラグを追加できます。
typer.sechoはfg引数で文字色を指定でき、成功と失敗を色分けできます。
実行コマンドとして配布する
python main.pyと打たずに済むよう、パッケージのエントリポイントに登録します。
[project.scripts]
mytool = "mypackage.main:app"左側がコマンド名、右側がモジュールとTyperアプリのパスです。
pip install -e .
mytool greet Izumi --formaleditableインストール後は、mytoolという短いコマンドでどこからでも呼び出せます。



「python main.py –install-completion」を実行すると、シェルのタブ補完も設定できます。
| 【当サイト】おすすめフリーランスエージェント3選 | |||
|---|---|---|---|
| エージェント | 評価 | ポイント | 公式サイト |
レバテックフリーランス | 5.0 | 業界最大級のエージェント。 高単価案件が豊富。 | 公式 |
Midworks | 4.8 | 満足度調査で 3年連続3冠を達成。 | 公式 |
ITプロパートナーズ | 4.6 | 週2〜3向けの案件が豊富。 | 公式 |
【厳選】フリーランスエンジニアにおすすめなエージェント3選


フリーランスエンジニアになるにはエージェントから案件をもらう必要があります。
僕が実際に利用しているおすすめエージェントを紹介しますね。



エージェントは必ず複数登録してください。
担当者によっては「全然案件紹介してくれない…」みたいなこともあるので…
僕は実際に5つのエージェントを使い回していますよ。
フリーランスを始めるなら「レバテックフリーランス


」
- 業界最大級の案件数。
- 業界トップクラスの高単価報酬、低マージン(平均年収862万円)。
- 案件参画中のフォローの充実。
※詳細は「【業界最大手】レバテックフリーランスとは?メリットや利用手順を解説!」を参照。
レバテックフリーランス
![]()
![]()
とにかく案件数が多いので、とりあえず登録しておけば間違いないエージェントです!



僕もはじめてフリーランスの案件を貰ったのはレバテックフリーランス
![]()
![]()
保有している案件数が多いので、業務経験がなくても何かしらの案件は紹介してもらえますよ(僕はJavaの経験3年でも案件を貰えました)。
手厚い保障を重視したいなら「Midworks


」
- 手厚い保障で正社員並みの安心感。
- 還元率60%超え&単価公開でクリアな契約。
- 給与保障制度(審査あり)。
Midworks
![]()
![]()
フリーランスを目指しているけど不安な方や保障を重視したい方におすすめです。



僕も何度か案件を紹介してもらいました。
自分のスキルに合った案件を紹介してもらえましたし、電話のやり取りも非常に丁寧でした。
週2〜3日の案件探しなら「ITプロパートナーズ


」
- IT案件に特化したフリーランスエージェント。
- 週2〜3日の案件が豊富。
- リモート案件が多く、直エンドなので単価も高い。
※詳細は「【週2・3案件】ITプロパートナーズとは?メリットや利用手順を解説!」を参照。
ITプロパートナーズ
![]()
![]()
週2〜3日から参画できる案件が豊富なので、起業したい人にもおすすめです。



週2〜3日の案件はある程度スキルがないと紹介してもらえない印象です。
とはいえ、週5の案件ももちろんありますし、僕が利用した時は迅速・丁寧に対応していただきました!
よくある質問
TyperとClickの違いは何ですか?
TyperはClickの上に作られており、デコレータで引数を1つずつ宣言する代わりに、関数の型ヒントから引数定義を生成する点が主な違いです。
記述量が減り、エディタの型補完も効きます。
argparseから移行すべきですか?
標準ライブラリだけで完結させたい場合はargparseのままで問題ありません。
サブコマンドの管理やヘルプの見やすさ、タブ補完を強化したい場合はTyperの導入で楽になります。
引数の説明文はどこに書きますか?
各引数の説明はAnnotated内のtyper.Optionやtyper.Argumentのhelpに書きます。
コマンド全体の説明は関数のdocstringがそのままヘルプに使われます。
まとめ
今回は、PythonのTyperでCLIツールを作る方法について解説しました。
以下が本記事のまとめになります。
- おすすめ本
Pythonの勉強なら「独習Python



最後までお読みいただき、ありがとうございました!
| 【当サイト】おすすめフリーランスエージェント3選 | |||
|---|---|---|---|
| エージェント | 評価 | ポイント | 公式サイト |
レバテックフリーランス | 5.0 | 業界最大級のエージェント。 高単価案件が豊富。 | 公式 |
Midworks | 4.8 | 満足度調査で 3年連続3冠を達成。 | 公式 |
ITプロパートナーズ | 4.6 | 週2〜3向けの案件が豊富。 | 公式 |
- クソおすすめ本



海外のエンジニアがどういった思考で働いているかが理解できます。
海外に行く気はないけど海外エンジニアの動向が気になる雑魚エンジニアにおすすめです(本当におすすめな本しか紹介しないのでご安心を)。









