Python にはスクリプトのコマンドライン引数を簡単に処理できる getopt
, optparse
, argparse
モジュールがあります。しかしこれらを使わずにコマンドライン引数を処理する方法を Google Sitemap Generator から発見しました。
読んだソースコードは sitemap_gen.py です。正規表現を使って手早くスクリプトのオプションを解析できます。
sitemap_gen.py には引数を処理する関数が定義されています。
def ProcessCommandFlags(args):
"""
Parse command line flags per specified usage, pick off key, value pairs
All flags of type "--key=value" will be processed as __flags[key] = value,
"--option" will be processed as __flags[option] = option
"""
flags = {}
rkeyval = '--(?P<key>S*)[=](?P<value>S*)' # --key=val
roption = '--(?P<option>S*)' # --key
r = '(' + rkeyval + ')|(' + roption + ')'
rc = re.compile(r)
for a in args:
try:
rcg = rc.search(a).groupdict()
if rcg.has_key('key'):
flags[rcg['key']] = rcg['value']
if rcg.has_key('option'):
flags[rcg['option']] = rcg['option']
except AttributeError:
return None
return flags
#end def ProcessCommandFlags
ProcessCommandFlags()
は、キーと値を指示する --key=value 型の引数と、オプションを指示する --option 型の引数を処理できるようになっています。返り値は None か辞書です。
ProcessCommandFlags() の使い方は、次のコードのように sys.argv
を渡して、その結果から次の処理を決定します。返り値が None か、辞書の config に値がないか、辞書に help があった場合には、 __usage__ を出力するようになっています。
if __name__ == '__main__':
flags = ProcessCommandFlags(sys.argv[1:])
if not flags or not flags.has_key('config') or flags.has_key('help'):
output.Log(__usage__, 0)
ProcessCommandFlags() では
--key=value 型の引数と --option 型の引数を、正規表現を使って解析しています。
rkeyval = '--(?P<key>S*)[=](?P<value>S*)' # --key=val
roption = '--(?P<option>S*)' # --key
r = '(' + rkeyval + ')|(' + roption + ')'
rc = re.compile(r)
下記のコードで、 --key=value 型の引数では辞書 flags
のキーに key
が設定され、その値には value
が代入されます。--option 型の引数は辞書のキーと値に option
が代入されるようになっています。
for a in args:
try:
rcg = rc.search(a).groupdict()
if rcg.has_key('key'):
flags[rcg['key']] = rcg['value']
if rcg.has_key('option'):
flags[rcg['option']] = rcg['option']
except AttributeError:
return None
return flags
最終更新日: 2015年05月16日(土)