Python:Tips:コマンドライン引数
2026/02/17
コマンドライン引数は自動化の強い味方
  • Pythonでスクリプトを作ると、処理対象や出力結果をコマンドライン引数で与えられるようにするだけで、汎用化が進むと感じることもあるでしょう。

  • コマンドライン引き数が使えれば、Windowsではバッチファイル、Linuxではシェルスクリプトと組み合わせて一連の処理を容易に自動化できます。

  • Pythonでのコマンドライン引数は下記の指定方法が代表的です。コマンドラインオプションはargparseで扱います。
    種類特徴
    sys.argv生のコマンドライン引数をそのまま取得
    argparseコマンドライン引数を構造化して扱う

sys.argv
  • sys.argvはコマンドラインで指定された引数をリストで全て引き込みます
    • 数値も全て文字列(str)として取り込むので、必要ならば後から型変換します。
    import sys           # sysライブラリをimport
    
    print(len(sys.argv)) # コマンドライン引数の個数
    print(sys.argv)      # 引数リストの表示
    
    >test.py 100 200
    3
    ['C:\\Users\\...中略...\\test.py', '100', '200']
    

  • sys.argvのインデックス[0]が実行スクリプト名、[1]以降が指定引数で、数値を指定しても文字列扱いです。
    • 上記例では、実行スクリプト名[0]はフルパス表示です。
    • 値に2byte文字が含まれる場合は、自動でutf-8へ変換されます(後述のargparseも同じです)。

  • Pythonインタープリタ経由で実行すると、実行スクリプト名はファイル名のみになります。
  • >python test.py 100 200 ← Pythonインタープリタ経由で実行
    3
    ['test.py', '100', '200']
    

argparse
  • オプション付きや複数の値を扱いたい場合は、argparseを利用します。使い方の流れは下記です。
    • argparse.ArgumentParser()でインスタンスを取得
    • .add_argument()メソッドでオプションを設定
    • .parse_args()メソッドでコマンドライン解析結果を取得

  • 使用例を見てみましょう。args_parserがargparseのインスタンスで、add_argument()でいろいろ設定しています。
    • 名前なし引数がオプション名になります(-無しなら位置引数です)
    • type: 値を受け取る場合は変換型(int/float/str)を指定します
    • help: usageやhelp表示で利用されます
    • required: required=Trueで指定必須オプションです
    • default: オプション未指定時のデフォルト値です
    • action: 'store_true'は、オプション指定時にTrueとなります
    import argparse # argparseライブラリをimport
    
    # コマンドライン引数のparserインスタンス取得
    args_parser = argparse.ArgumentParser()
    
    # --input_name は必須(required)オプション
    args_parser.add_argument('--input_name',  type=str, help='input file name',  required=True)
    # --output_nameは省略可能で、デフォルトは'hoge.txt'
    args_parser.add_argument('--output_name', type=str, help='output file name', default='hoge.txt')
    # --over_writeは指定されればTrue
    args_parser.add_argument('--over_write',  action='store_true', help="output overwrite flag")
    
    # コマンドライン引数の解析結果取得(Namespaceオブジェクト)
    namespace_args = args_parser.parse_args()
    print(namespace_args)
    
    # Namespaceオブジェクトをdictに変換
    dict_args = vars(namespace_args)
    print('dict:', dict_args)
    
    >test.py --input_name hoge.txt --output_name fuga.txt
    Namespace(input_name='hoge.txt', output_name='fuga.txt', over_write=False)
    dict: {'input_name': 'hoge.txt', 'output_name': 'fuga.txt', 'over_write': False}
    

  • この設定状態で、例えば必須オプション無しで実行すると、usageとerror内容を出力してくれます。
  • >test.py
    usage: test.py [-h] --input_name INPUT_NAME [--output_name OUTPUT_NAME] [--over_write]
    test.py: error: the following arguments are required: --input_name
    

  • usgaeの先頭に[-h]がありますね。'-h'か'--help'でhelp出力も自動で出してくれます。
  • >test.py -h
    usage: test.py [-h] --input_name INPUT_NAME [--output_name OUTPUT_NAME] [--over_write]
    
    options:
      -h, --help            show this help message and exit
      --input_name INPUT_NAME
                            input file name
      --output_name OUTPUT_NAME
                            output file name
      --over_write          output overwrite flag
    

  • 尚、-h以外は自動短縮になりません。自分で短縮形(別名)を追加します。何個でも追加できます。
  • .add_argument('--input_name', '-in', type=str, help='input file name', required=True)
    

  • あるオプションで値を複数受け取るにはappendかnargsを指定します。詳しくはAI先生かGoogle先生へ。

ワイルドカードの扱い
  • ファイルのワイルドカードが指定された場合、展開されるかされないかは、実行環境/シェルによって決まります。
    • Windows コマンドプロンプト: 展開されない
    • Windows Powershell: 展開される
    • Linux Shell: 展開される
Copyright(C) 2026 Altmo
本HPについて