23 March 2014

(Python) スクリプトの引数を得る手法 sys.argvと argaprse

sys.srgv を使う方法

C言語などと類似した引数のハンドリング

test-srgv.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
import sys
 
argc = len(sys.argv)
 
print "引数の数 = %d" % argc
 
# argvリストを順に展開して表示していく
i = 0
for item in sys.argv:
    print "argv[%d] = %s" % (i, item)
    i = i + 1
 
# 引数の数より、1つずつargvリストを表示していく
for i in range(0, argc):
    print "argv[%d] = %s" % (i, sys.argv[i])

このプログラムの実行結果

$ python test-argv.py aa "bb cc"
引数の数 = 3
argv[0] = test-argv.py
argv[1] = aa
argv[2] = bb cc
argv[0] = test-argv.py
argv[1] = aa
argv[2] = bb cc

argparse を使う方法

test-argparse.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
import argparse
 
parser = argparse.ArgumentParser(description='argparse テストプログラム')
parser.add_argument('str1', nargs='?', help='文字列の引数(str1)')
parser.add_argument('-a', help='文字列(a)', metavar='str_a')
parser.add_argument('-x', help='スイッチ(x)', action="store_true")
 
args = parser.parse_args()
 
if args.str1 is not None:
    print "文字列(str1) = %s" % args.str1
else:
    print "文字列(str1) は指定されませんでした"
 
if args.a is not None:
    print "文字列(a) = %s" % args.a
else:
    print "文字列(a) は指定されませんでした"
 
if args.x is True:
    print "スイッチ(x) = True"
else:
    print "スイッチ(x) = False"

このプログラムの実行結果

$ python test-argparse.py -a "aa bb" cc -x
文字列(str1) = cc
文字列(a) = aa bb
スイッチ(x) = True

ヘルプメッセージを表示する

$ python test-argparse.py -h
usage: test-argparse.py [-h] [-a str_a] [-x] [str1]
 
argparse テストプログラム
 
positional arguments:
  str1        文字列の引数(str1)
 
optional arguments:
  -h, --help  show this help message and exit
  -a str_a    文字列(a)
  -x          スイッチ(x)