Python Academy · レッスン

サブコマンドとオプション

複雑なCLIを構築します

レッスン 2/413 ステップ

「サブコマンドとオプション」はCoddyKit上の無料Python Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPython Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Python Academyコースには全4レッスンが含まれています。

なぜサブコマンドなのか

gitのようなツールには、git addやgit commitなどのサブコマンドがあります。argparseではサブパーサーを使ってこれを実現でき、各サブコマンドに独自の引数を設定できます。

import argparse

parser = argparse.ArgumentParser(prog='tool')
sub = parser.add_subparsers(dest='command')
print('subparsers ready')

サブパーサーの追加

add_subparsersは、add_parserメソッドで各サブコマンドを作成できるオブジェクトを返します。destには選択されたサブコマンドが格納されます。

import argparse

parser = argparse.ArgumentParser()
sub = parser.add_subparsers(dest='command')
sub.add_parser('start')
sub.add_parser('stop')
args = parser.parse_args(['start'])
print('command:', args.command)

サブコマンドごとの引数

各サブパーサーには独自の引数を定義できます。ここでのaddサブコマンドは名前を受け取り、listは何も受け取りません。

import argparse

parser = argparse.ArgumentParser()
sub = parser.add_subparsers(dest='command')
p_add = sub.add_parser('add')
p_add.add_argument('name')
sub.add_parser('list')
args = parser.parse_args(['add', 'milk'])
print(args.command, args.name)

コマンドの振り分け

解析後、args.commandの値に応じて分岐し、適切な処理を実行します。

import argparse

parser = argparse.ArgumentParser()
sub = parser.add_subparsers(dest='command')
p_add = sub.add_parser('add')
p_add.add_argument('item')
sub.add_parser('clear')

args = parser.parse_args(['add', 'eggs'])
if args.command == 'add':
    print('adding', args.item)
elif args.command == 'clear':
    print('clearing all')

ハンドラーのためのset_defaults

各サブパーサーにset_defaults(func=...)で関数を関連付け、続いてargs.func(args)を呼び出す方法が、すっきりしたパターンです。

import argparse

def do_hi(args):
    print('hi', args.who)

parser = argparse.ArgumentParser()
sub = parser.add_subparsers()
p = sub.add_parser('hi')
p.add_argument('who')
p.set_defaults(func=do_hi)

args = parser.parse_args(['hi', 'Ana'])
args.func(args)

親パーサーによる共通オプション

親パーサーに複数のサブコマンドで共通するオプションをまとめると、重複を避けられます。parents=[base]とadd_help=Falseを渡します。

import argparse

base = argparse.ArgumentParser(add_help=False)
base.add_argument('--verbose', action='store_true')

parser = argparse.ArgumentParser()
sub = parser.add_subparsers(dest='cmd')
sub.add_parser('run', parents=[base])
args = parser.parse_args(['run', '--verbose'])
print(args.cmd, args.verbose)

オプションごとのデフォルト値

サブコマンドのオプションには、トップレベルの引数と同様に、それぞれ独自のデフォルト値と型を設定できます。

import argparse

parser = argparse.ArgumentParser()
sub = parser.add_subparsers(dest='cmd')
p = sub.add_parser('scale')
p.add_argument('--factor', type=float, default=1.0)
args = parser.parse_args(['scale'])
print('factor:', args.factor)

オプションの繰り返し指定

action='append'を使うと、フラグを複数回指定でき、それぞれの値をリストに収集できます。

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--tag', action='append', default=[])
args = parser.parse_args(['--tag', 'a', '--tag', 'b'])
print(args.tag)

フラグのカウント

action='count'は、フラグが何回現れたかを数えます。これは-vvvという詳細度指定でよく使われるパターンです。

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('-v', action='count', default=0)
args = parser.parse_args(['-v', '-v', '-v'])
print('verbosity level:', args.v)

2つのコマンドを持つツール

サブコマンド、ハンドラー、共通オプションを組み合わせると、構造化された複数コマンド対応のCLIになります。

import argparse

def add(args):
    print('add', args.item, 'qty', args.qty)

def remove(args):
    print('remove', args.item)

parser = argparse.ArgumentParser()
sub = parser.add_subparsers()
pa = sub.add_parser('add')
pa.add_argument('item')
pa.add_argument('--qty', type=int, default=1)
pa.set_defaults(func=add)
pr = sub.add_parser('remove')
pr.add_argument('item')
pr.set_defaults(func=remove)

args = parser.parse_args(['add', 'pen', '--qty', '3'])
args.func(args)

必須のサブコマンド

サブパーサーにrequired=Trueを設定すると、ユーザーは必ずコマンドを選択する必要があり、選択しなければargparseがエラーを返します。

import argparse

parser = argparse.ArgumentParser()
sub = parser.add_subparsers(dest='cmd', required=True)
sub.add_parser('go')
args = parser.parse_args(['go'])
print('chosen:', args.cmd)

理解度チェック

サブコマンドとオプションについての理解度を確認しましょう。

まとめ

サブコマンドとオプションについて学びました。

  • add_subparsersとadd_parserで複数コマンド対応のツールを構築します。
  • set_defaults(func=...)でハンドラーに処理を振り分けます。
  • 親パーサーで共通オプションを共有できます。
  • appendとcountアクションで繰り返し指定されたフラグを処理します。

次は、デコレーター方式のCLIを構築するClickライブラリについて学びます。

無料で開始

AI チューターと学ぶ Python — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
76
レッスン
320

よくある質問

「サブコマンドとオプション」レッスンは無料ですか?

はい。「サブコマンドとオプション」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Python Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Python Academyコースには全4レッスンが含まれています。

「サブコマンドとオプション」で何を学びますか?

複雑なCLIを構築します ブラウザで直接実行するハンズオンコードでPython Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Python Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのPython Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「サブコマンドとオプション」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このPython Academyレッスンでコードを書いて実行できますか?

はい。すべてのPython Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. argparseの基礎
  2. サブコマンドとオプション
  3. Clickライブラリ
  4. リッチなターミナル出力
← Python Academyに戻る