2016年3月14日

コマンドラインアプリにはargparse

アプリケーションの引数を解析する argparse を紹介します。

Python で起動したアプリケーションは、sys.argv に引数が格納されています。型は文字列のリストで、[0]がモジュール名、[1]以降が引数となります。

# sample.py
# 引数を出力するだけのソースコード
import sys
print(sys.argv)


# 引数を与えてsample.pyを実行
> python sample.py -s src.txt --dst dst.xml
['sample.py', '-s', 'src.txt', '--dst', 'dst.xml']

argparse はこの引数を解析するためのライブラリです。
以下は argparse を用いたプログラムの実装例です。このプログラムでは、2つのファイル名を引数として取得します。

# convert.py
import argparse

__version__ = '1.0.0'

def main():
    # parserを作成
    parser = argparse.ArgumentParser(description='Convert file')
    parser.add_argument('-v', '--version', action='version',
                        version=('%(prog)s ' + __version__))
    parser.add_argument('-s', '--src', metavar='src',
                        type=str, help='source file name')
    parser.add_argument('-d', '--dst', metavar='dst',
                        type=str, help='output file name')

    # sys.argvをparseし、引数を取得
    args = parser.parse_args()

    # 引数を使った何らかの動作
    print(args.src)
    print(args.dst)

if __name__ == '__main__':
    main()

実行例です。
> python convert.py -s src.txt --dst dst.xml
src.txt
dst.xml

また、バージョン表示やヘルプ表示も可能です。
# バージョン表示
> python convert.py -v
convert.py 1.0.0


# ヘルプ表示
> python convert.py -h
usage: module1 [-h] [-v] [-s src] [-d dst]

Convert file

optional arguments:
  -h, --help         show this help message and exit
  -v, --version      show program's version number and exit
  -s src, --src src  source file name
  -d dst, --dst dst  output file name
argparse は豊富な機能を備えているので、引数解析部分の車輪の再発明を回避することができます。
また、argparse を使うことで、ヘルプなどの基本コマンドの統一にもつながります。
引数を用いるコマンドラインアプリでは、argparse を使うことが推奨されます。



以下余談です。
Python には元々、getopt という C言語の同名ライブラリを模したモジュールと、よりモダンな optparser がありました。
しかし、optparser よりも更に高機能な引数解析が必要となり、argparse が作成されました。標準モジュールが似た機能のモジュールを複数持ったことにより、混乱もあったものと思われます(https://www.python.org/dev/peps/pep-0389/)。
argparse がリリースされた 3.2 以降(Python 2 では 2.7以降)は、optparser は非推奨となっています。

0 件のコメント:

コメントを投稿