11
我正在將subparsers添加到我的分析器中以模擬子命令的功能(例如,代碼請參閱:Simple command line application in python - parse user input?)。現在我想添加一個quit
子分析器/命令,它不接受任何參數並附加一個「退出」操作。可能嗎 ?我怎麼去解決它?python argparse - 將操作添加到沒有參數的子分析器中?
我正在將subparsers添加到我的分析器中以模擬子命令的功能(例如,代碼請參閱:Simple command line application in python - parse user input?)。現在我想添加一個quit
子分析器/命令,它不接受任何參數並附加一個「退出」操作。可能嗎 ?我怎麼去解決它?python argparse - 將操作添加到沒有參數的子分析器中?
subcommands
的文檔給出瞭如何識別子分析器的兩個示例。
https://docs.python.org/dev/library/argparse.html#sub-commands
一個是給add_subparsers
一個dest
:
def do_quit(args):
# action
quit()
parser = ArgumentParser()
subparser = parser.add_subparsers(dest='cmd')
....
subparser.add_parser('quit')
...
args = parser.parse_args()
print args.cmd # displays 'quit'
if args.cmd == 'quit':
do_quit(args)
另一種是使用set_defaults
給子分析器與函數鏈接:
parser = ArgumentParser()
subparsers = parser.add_subparsers()
...
parser_quit = subparsers.add_parser('quit')
parser_quit.set_defaults(func=do_quit)
...
args = parser.parse_args()
args.func(args)
在進一步思考,這是一種方法,使用自定義Action
。它就像_HelpAction
(由-h
使用)。它的位置參數是nargs=0
(或'?')。這樣的參數總是被調用,即使沒有字符串匹配它(或者說,0個字符串匹配它)。這是一個合理的,但有點模糊的結果,如何處理定位。
class QuitAction(argparse.Action):
def __call__(self, parser, *args, **kwargs):
parser.exit(message="QUITTING\n")
p=argparse.ArgumentParser()
sp=p.add_subparsers(dest='cmd')
p1=sp.add_parser('quit')
p1.add_argument('foo', action=QuitAction, nargs='?', help=argparse.SUPPRESS)
p.parse_args(['quit'])
生產(當IPython中運行):
QUITTING
An exception has occurred, use %tb to see the full traceback.
SystemExit: 0
謝謝!如果你看看鏈接的代碼:http://stackoverflow.com/questions/25332925/simple-command-line-application-in-python-parse-user-input/25368374#25368374你會看到我想要的解析自動發生 - 我不想在解析器外部添加邏輯。別無退路 ?我可以爲主分析器添加一個「退出」參數嗎(不是'-quit')?編輯:[github](https://github.com/Utumno/psync/blob/master/watcher/cli.py) – 2014-08-31 21:43:19
當然 - 重新定義'parse_args'的'ArgumentParser'子類。它會首先調用'super()。parse_args'(或'parse_known_args'),然後執行'解析器之外的邏輯'。只有你確切知道隱藏在方法定義後面的是什麼。 – hpaulj 2014-08-31 22:41:44
我添加了一個使用可選postional參數的方法。 – hpaulj 2014-09-01 00:41:50