あなたのアプローチには2つの問題があります。
newstate
最初に、これは sub パーサーの sub_value ではなく、 as の最上位レベルで対処する必要があることにargs
既に気付いているでしょうargs.newstate
。これは、デフォルトを 2 回に割り当てるnewstate
と、最初の値が上書きされることを説明しているはずです。パラメータとして「ON」または「OFF」を指定してプログラムを呼び出すかどうかに関係なく、毎回set_state()
が呼び出されOFF
ます。できるようにしたいだけpython cvsSecure ON
で
python cvsSecure OFF
、次のようにするとうまくいきます。
from __future__ import print_function
import sys
import argparse
def set_state(state):
print("set_state", state)
def do_on(args):
set_state('ON')
def do_off(args):
set_state('OFF')
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers()
parser_on = subparsers.add_parser('ON')
parser_on.set_defaults(func=do_on)
parser_on.add_argument('--fast', action='store_true')
parser_off = subparsers.add_parser('OFF')
parser_off.set_defaults(func=do_off)
args = parser.parse_args()
args.func(args)
2 番目の問題は、argparse
サブパーサーを単一値の引数として処理するため、呼び出す前にサブパーサーを指定する必要があることparser.parse_args()
です。サブパーサー「PRINT」を追加し、 set_default_subparser
added toを使用して自動的に挿入することで、不足している引数の挿入を自動化できますargparse.ArgumentParser()
(そのコードはパッケージruamel.std.argparseの一部です)。
from __future__ import print_function
import sys
import argparse
def set_default_subparser(self, name, args=None):
"""default subparser selection. Call after setup, just before parse_args()
name: is the name of the subparser to call by default
args: if set is the argument list handed to parse_args()
, tested with 2.7, 3.2, 3.3, 3.4
it works with 2.6 assuming argparse is installed
"""
subparser_found = False
for arg in sys.argv[1:]:
if arg in ['-h', '--help']: # global help if no subparser
break
else:
for x in self._subparsers._actions:
if not isinstance(x, argparse._SubParsersAction):
continue
for sp_name in x._name_parser_map.keys():
if sp_name in sys.argv[1:]:
subparser_found = True
if not subparser_found:
# insert default in first position, this implies no
# global options without a sub_parsers specified
if args is None:
sys.argv.insert(1, name)
else:
args.insert(0, name)
argparse.ArgumentParser.set_default_subparser = set_default_subparser
def print_state(args):
print("print_state")
def set_state(state):
print("set_state", state)
def do_on(args):
set_state('ON')
def do_off(args):
set_state('OFF')
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers()
parser_print = subparsers.add_parser('PRINT', help='default action')
parser_print.set_defaults(func=print_state)
parser_on = subparsers.add_parser('ON')
parser_on.set_defaults(func=do_on)
parser_on.add_argument('--fast', action='store_true')
parser_off = subparsers.add_parser('OFF')
parser_off.set_defaults(func=do_off)
parser.set_default_subparser('PRINT')
args = parser.parse_args()
args.func(args)
args
toなどで処理する必要はありませんがdo_on()
、さまざまなサブパーサーにオプションを指定し始めると便利です。