猫型エンジニアのブログ

プログラム/ネットワーク系の技術関連をまとめたページです 

引数の解析

 Ryuではoslo.configというモジュールを用いて引数の解析を行っています。manager.pyの該当ソースコードを一部抜粋修正しました。

#test-config.py
from ryu import cfg
import sys
from ryu import version

CONF = cfg.CONF
CONF.register_cli_opts([
    cfg.ListOpt('app_lists', default=[],
                help='application module name to run'),
    cfg.MultiStrOpt('app', positional=True, default=[],
                    help='application module name to run')
])

def main(args=None, prog=None):

    try:
        CONF(args=args, prog=prog,
             project='ryu', version='ryu-manager %s' % version,
             default_config_files=['/usr/local/etc/ryu/ryu.conf'])
    except cfg.ConfigFilesNotFoundError:
        CONF(args=args, prog=prog,
             project='ryu', version='ryu-manager %s' % version)

    print 'CONF.app_list: %s' % (CONF.app_lists, )
    print 'CONF.app: %s' % (CONF.app, )

main()

 以下に実行例とその結果を記載ました。oslo.configのListとMultiStrの違いが分かります。

#オプションを指定しない場合はappに引数が格納される。
$ python test-config.py test
CONF.app_list: []
CONF.app: ['test']

#オプションを指定せずに引数を複数個指定した場合は、同一の要素として扱われる。
$ python test-config.py test1,test2
CONF.app_list: []
CONF.app: ['test1,test2']

#オプションにapp_listsを指定した場合は、app_listsに引数が格納される。
$ python test-config.py --app_lists test
CONF.app_list: ['test']
CONF.app: []

#オプションにapp_listsを指定して引数を複数個指定した場合は、別の要素として扱われる。
$ python test-config.py --app_lists test,test2
CONF.app_list: ['test', 'test2']
CONF.app: []

#ヘルプコマンドの実施
$ python test-config.py -h
usage: test-config.py [-h] [--app_lists APP_LISTS] [--config-dir DIR]
                      [--config-file PATH] [--version]
                      [app [app ...]]