コマンドライン引数の処理

今のところ、以下のようなコマンドを考えています。

コマンド名 機能
site サイトのテンプレートを生成する
page サイトの中にページディレクトリを作成する
build サイトディレクトリの内容を元にHTMLファイルを生成する

これを踏まえて、sohtml.pyにPythonコードを書いていきます。

(ファイル名) sohtml.py

from argparse import ArgumentParser as ap
import html_tag

def main():
    parser = ap()
    cmd_choices = ['site', 'page', 'html']
    parser.add_argument("command", help="command", choices=cmd_choices)
    parser.add_argument("name")
    args = parser.parse_args()
   
    if args.command == 'site':
        print('デフォルトサイト{}を作成します'.format(args.name))
    elif args.command == 'page':
        print('ページ{}を作成します'.format(args.name))
    elif args.command == 'html':
        print('HTMLファイルを{}ディレクトリに生成します'.format(args.name))


if __name__ == '__main__':
    main()

ところが、このプログラムだとコマンドライン引数に「build」を指定した時も、ダミーの引数を後に続けないとエラーになってしまいます。

❏buildだけのとき

$ sohtml build
usage: sohtml [-h] {site,page,build} name
sohtml: error: the following arguments are required: name

❏buildにダミー引数をつけた時

$ sohtml build hoge
HTMLファイルを生成します

buildを指定した時は、nameに相当する引数を指定しなくてもいいようにしたいのです。
残念ながら、Argparse チュートリアルには書いていませんでした。
しょうがないので、argparseマニュアルを最初から読み込むことにします。

参考サイト

Argparse チュートリアル
argparseマニュアル