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

コマンドライン解析 Python モジュール


最終更新日: 2015年05月16日(土)


Back to top