ユーニックス総合研究所

  • home
  • archives
  • python-argparse

Pythonのargparseの使い方【オプション解析】

  • 作成日: 2021-05-14
  • 更新日: 2024-01-06
  • カテゴリ: Python

Pythonのargparseの使い方

Pythonにはプログラムのオプションなどを解析できる標準ライブラリargparseがあります。
このライブラリを使うと簡単にプログラムの引数を解析できます。

この記事ではPythonのargparseの使い方をわかりやすく解説します。
結論から言うとargparseは↓のように使います。

import argparse  


parser = argparse.ArgumentParser('mycmd', description='これはサンプルプログラムです。')  
parser.add_argument('words', nargs='+', help='単語のリストです。')  
parser.add_argument('-j', '--join', type=str, help='単語を連結します')  
args = parser.parse_args()  

# $ python intro.py cat dog --join :  
print(args.words)  
# ['cat', 'dog']  
print(args.join)  
# :  

print(args.join.join(args.words))  
# cat:dog  

具体的には↓の項目を見ていきたいと思います。

  • プログラムの引数とオプション
  • argparseの大まかな使い方
  • ArgumentParserをオブジェクトにする
  • add_argument()で引数の定義を追加する
  • parse_args()で引数を解析する
  • 解析結果(args)を使用する

関連記事
Pythonのコマンドライン引数の使い方

プログラムの引数とオプション

プログラムにもいろいろありますが、WindowsのコマンドプロンプトやUNIX系で使われるBashなどのシェルに、コマンドを書いて実行するプログラムを一般に「コマンド」とか「CLIのプログラム」と言います。
コマンドと言うのは例えば↓のようなものです。

$ mycmd  

↑の場合、mycmdというのがコマンドで、プログラムです。
↑は引数を何も指定していない状態です。
このmycmdに引数を指定する場合は↓のようにします。

$ mycmd arg1 arg2  

引数は複数指定でき、コマンドはその引数を受け取ってプログラムの振る舞いを変えます。
またオプションというのもプログラムの振る舞いを変えるものです。
UNIX系のコマンドのオプションは---で始まるキーワードです。
-がショートオプションで--がロングオプションと呼ばれます。
つまり↓のようなものがオプションです。

$ mycmd -o --opt1  

オプションは単独で指定出来たり、そのオプションに引数を与えることも出来ます。

$ mycmd --opt optarg  
$ mycmd --opt=optarg  

今回解説するargparseは↑のようなコマンドの引数やオプションを解析してくれるものです。
argparseを使うと簡単にこれらの解析結果が利用できます。
覚えることはちょっと多いですが、慣れてしまえば非常に楽に使えます。

argparseの大まかな使い方

argparseの大まかな使い方を先に示します。
argparseは↓のように使います。

  1. argparseをインポートする
  2. ArgumentParserをオブジェクトにする
  3. add_argument()で引数の定義を追加する
  4. parse_args()で定義に従ってプログラムの引数を解析する
  5. 解析結果を使ってプログラムの振る舞いを変える

まずargparseをインポートしたらargparse.ArgumentParserというクラスをオブジェクトにする必要があります。
このオブジェクトに引数の定義を追加していって、解析を行わせ、その解析結果を利用します。

add_argument()ArgumentParserのメソッドでこのメソッドで引数の定義を追加します。
parse_args()も同様で、このメソッドはプログラムの引数を追加された定義に従って解析します。

parse_args()は解析結果をオブジェクトとして返します。
このオブジェクトに保存されている解析結果、つまり引数の値やオプションの値を利用してプログラムの振る舞いを変えるという感じになります。

ArgumentParserをオブジェクトにする

最初にargparseをインポートします。

import argparse  

そしてargparseArgumentParserをオブジェクトにします。
この時、第1引数にはプログラムの名称を指定します。
descriptionキーワード引数にはプログラムの説明を書きます。
オブジェクトのprint_help()を呼び出すとこれらがどのように表示されるのか確認することができます。

parser = argparse.ArgumentParser('mycmd', description='これはプログラムの説明です')  
parser.print_help()  
#   
# usage: mycmd [-h]  
#   
# これはプログラムの説明です  
#   
# optional arguments:  
#   -h, --help  show this help message and exit  

add_argument()で引数の定義を追加する

ArgumentParserをオブジェクト(parser)にしたら、このオブジェクトのadd_argument()メソッドを使って引数を定義します。
定義は複数追加することが可能です。
引数の定義例を↓に示します。

引数を1つだけ取る

引数を1つだけ取るようにしたい場合は↓のように定義します。

parser.add_argument('myarg', type=str, help='プログラムの引数です')  

myargというのは解析結果の変数名になります。
type=strとすることで引数のタイプが文字列だと明示しています。
helpにはその引数の説明を書くことができます。

この引数の定義は↓のようなコマンドに対応します。

$ mycmd abc  

引数を複数取る

引数を複数取るようにしたい場合は↓のように定義します。

parser.add_argument('myargs', type=str, nargs='+', help='プログラムの引数です')  

nargs+を指定すると「1個以上の引数を取る」という定義になります。
これが*だと「0個以上の引数を取る」という定義になります。

この定義だとmyargsの値はリストになります。
またコマンドは↓のようなものに対応します。

$ mycmd abc def ghi  

オプションを定義する

ショートオプションとロングオプションを定義する場合は↓のようにします。

parser.add_argument('-m', '--myopt', action='store_true', help='プログラムのオプションです')  

↑の定義の場合、解析結果の変数はmyoptになります。
↑の場合-m--myoptが指定されたら解析結果のmyoptの値がTrueになります。
actionにはオプションが指定されたときの振る舞いを書くことができます。store_trueは「Trueを保存しろ」という意味です。
コマンドは↓のようになります。

$ mycmd -m  
$ mycmd --myopt  

ちなみにショートオプションやロングオプションは互いに省略することができます。

parser.add_argument('-a', action='store_true')  
parser.add_argument('--bbb', action='store_true')  

ショートオプションのみの場合は↑の場合aと言う変数に解析結果が保存されます。

オプションに値を設定したい場合は↓のようにします。

parser.add_argument('--file', type=str)  

コマンドは↓のようになります。

$ mycmd --file /tmp/abc.txt  

parse_args()で引数を解析する

ArgumentParserparse_args()を呼び出すとプログラムの引数が解析されます。

args = parser.parse_args()  

このメソッドの返り値は解析結果です。
引数やオプションの値がここに保存されています。

解析結果(`args`)を使用する

解析結果を利用するサンプルを↓に示します。

import argparse  


parser = argparse.ArgumentParser('upperjoin', description='単語を連結します。')  
parser.add_argument('words', nargs='+', help='単語のリストです。')  
parser.add_argument('-j', '--join', type=str, help='単語を連結します')  
parser.add_argument('--upper', action='store_true', help='単語を大文字にします')  
args = parser.parse_args()  

words = args.words  
if args.upper:  
    words = [w.upper() for w in words]  

if args.join:  
    result = args.join.join(words)  
    print(result)  
    # $ python upperjoin.py arg1 arg2 --upper --join :  
    # ARG1:ARG2  
else:  
    print(words)  
    # $ python upperjoin.py arg1 arg2  
    # ['arg1', 'arg2']  

↑のプログラムは引数に指定された文字列を整形します。
オプション--upperが指定されている場合は文字列を大文字にし、--joinが指定されている場合は文字列をセパレーターで結合します。

おわりに

今回はPythonのargparseの使い方を解説しました。
argparseは使い慣れると非常に使いやすいライブラリと言えます。
オプションの解析はこれに任せましょう。

🦝 < オプションはプログラムを豊かにする