前面
功能比較多的命令端程序常常將功能分解到不同子命令中,如在Python中常見的pip install、pip uninstall等。當(dāng)程序比較復(fù)雜且不同功能都需要不同參數(shù)時(shí),子命令是一個(gè)不錯(cuò)的方式。
正文
argparse 使用add_subparsers()方法去創(chuàng)建子命令。代碼:
import argparse
parser = argparse.ArgumentParser(prog='PROG')
subparsers = parser.add_subparsers(help='sub-command help')
#添加子命令 add
parser_a = subparsers.add_parser('add', help='add help')
parser_a.add_argument('-x', type=int, help='x value')
parser_a.add_argument('-y', type=int, help='y value')
#添加子命令 sub
parser_s = subparsers.add_parser('sub', help='sub help')
parser_s.add_argument('-x', type=int, help='x value')
parser_s.add_argument('-y', type=int, help='y value')
args = parser.parse_args()
print('x', args.x, 'y', yargs.y)
終端運(yùn)行程序
$python subc.py add -x 1 -y 2
x 1 y 2
$python subc.py sub -x 1 -y 2
x 1 y 2
但是是沒辦法判斷你使用的是哪個(gè)子命令的。所幸的是argparse提供了一個(gè)一個(gè)方法set_defaults(),可以將子命令綁定特定的函數(shù)。
import argparse
def add(args):
r = args.x + args
print('x + y = ', r)
def sub(args):
r = args.x - args
print('x - y = ', r)
parser = argparse.ArgumentParser(prog='PROG')
subparsers = parser.add_subparsers(help='sub-command help')
#添加子命令 add
parser_a = subparsers.add_parser('add', help='add help')
parser_a.add_argument('-x', type=int, help='x value')
parser_a.add_argument('-y', type=int, help='y value')
#設(shè)置默認(rèn)函數(shù)
parser_a.set_defaults(func=add)
#添加子命令 sub
parser_s = subparsers.add_parser('sub', help='sub help')
parser_s.add_argument('-x', type=int, help='x value')
parser_s.add_argument('-y', type=int, help='y value')
#設(shè)置默認(rèn)函數(shù)
parser_s.set_defaults(func=sub)
args = parser.parse_args()
#執(zhí)行函數(shù)功能
args.func(args)
終端運(yùn)行程序
$python subc.py add -x 1 -y 2
x + y = 3
$python subc.py sub -x 1 -y 2
x - y = -1
argparse會將子命令會運(yùn)行相應(yīng)的函數(shù)執(zhí)行子命令綁定函數(shù)功能
其它
但是如果你嘗試運(yùn)行多個(gè)子命令是會報(bào)錯(cuò)。默認(rèn)不支持平行運(yùn)行多個(gè)子命令的。不過可以給子命令在添加子命令。關(guān)于運(yùn)行多個(gè)子命令的解決辦法感興趣的可以去stackoverflow查看這個(gè)問題下的答案:
How to parse multiple nested sub-commands using python argparse?
參考:
https://docs.python.org/3/library/argparse.html#sub-commands