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)
上一篇下一篇

猜你喜欢

热点阅读