Python3解析命令行参数
2018-12-26 本文已影响0人
多问Why
一种应用场景是需要处理多个mp3文件,需要在参数中指定文件列表,还有些选项可以控制处理细节。
#!/usr/bin/env python3
import argparse
parser = argparse.ArgumentParser(description='Search some files')
parser.add_argument(dest='filenames', metavar='filename', nargs='*')
parser.add_argument('-p', '--pat', metavar='pattern', required=True,
dest='patterns', action='append',
help='text pattern to search for')
parser.add_argument('-v', dest='verbose', action='store_true',
help='verbose mode')
parser.add_argument('-o', dest='outfile', action='store',
help='output file')
parser.add_argument('--speed', dest='speed_2', action='store',
choices={'slow', 'fast'}, default='slow',
help='search speed')
args = parser.parse_args()
# Output the collected arguments
print(args.filenames)
print(args.patterns)
print(args.verbose)
print(args.outfile)
print(args.speed_2)
这样可以用python temp.py -p spoon -p egg -v -o r.txt --speed=fast 1.mp3 2.mp3
来运行。
dest指定的值用作key从解析后的对象中取出用户输入。metavar用于帮助,执行-h会显示帮助。action是append时,这个参数可以出现多次,结果是一个列表。为store时,出现多次前面的会被覆盖。store_true时,结果为bool型。注意前面的中划线-不能省略。
另一种简单但常用的场景是,这个脚本可以执行多个任务但一次只执行一种,例如
gradle test, gradle build这样的。
import argparse
parser = argparse.ArgumentParser(allow_abbrev=False)
subparsers_cmd = parser.add_subparsers(dest='cmd', help='commands')
subparsers_cmd.add_parser('clear')
parser_test = subparsers_cmd.add_parser('test')
subparsers_cmd.add_parser('build')
args=parser.parse_args()
if not args.cmd:
print(parser.print_help())
raise SystemExit(1)
print(args.cmd)
这样用户只能从指定的三个子命令中选择一个执行,如:python3 temp.py test
。
还可以指定每个子命令默认执行的函数。
import argparse
def test():
print("test start")
def build():
print("build start")
parser = argparse.ArgumentParser(allow_abbrev=False)
subparsers_cmd = parser.add_subparsers(dest='cmd', help='commands')
subparsers_cmd.add_parser('clear')
parser_test = subparsers_cmd.add_parser('test')
# run_func can change to other names
parser_test.set_defaults(run_func=test)
parser_build = subparsers_cmd.add_parser('build')
parser_build.set_defaults(run_func=build)
args = parser.parse_args()
if not args.cmd:
print(parser.print_help())
raise SystemExit(1)
args.run_func()
print(args.cmd)
当然子命令还可以再加与之对应的参数:
import argparse
parser = argparse.ArgumentParser(allow_abbrev=False)
subparsers_cmd = parser.add_subparsers(dest='cmd', help='commands')
subparsers_cmd.add_parser('clear')
parser_test = subparsers_cmd.add_parser('test')
parser_test.add_argument('-v', dest='verbose', action='store_true',
help='verbose mode')
parser_test.add_argument('-p', '--pat', metavar='pattern', required=True,
dest='patterns', action='append',
help='text pattern to search for')
parser_build = subparsers_cmd.add_parser('build')
args = parser.parse_args()
if not args.cmd:
print(parser.print_help())
raise SystemExit(1)
print(args.cmd)
if args.cmd == 'test':
print(args.verbose)
print(args.patterns)