我主要想做的功能就是执行python脚本时带上参数,然后执行参数对应的功能。
基础学习
官方解读:https://docs.python.org/zh-cn/3/library/argparse.html
主要有三个步骤:
1. 创建 ArgumentParser() 对象
2. 调用 add_argument() 方法添加参数
3. 使用 parse_args() 解析添加的参数
添加参数
分为添加位置参数-positional arguments和可选参数-optional arguments
添加位置参数声明的参数名前缀不带-或--,按照顺序进行解析,在命令中必须出现,否则报错。
parser.add_argument("a")
parser.add_argument('integers',metavar='N',type=int,nargs='+',help='an integer for the accumulator')
添加可选参数声明的参数名前缀带-或--,前缀是-的为短参数,前缀是--是长参数,两者可以都有,也可以只有一个,短参数和长参数效果一样。可选参数的值接在位置参数的后面,不影响位置参数的解析顺序。
parser.add_argument('--sum',dest='accumulate',action='store_const',const=sum,default=max,help='sum the integers (default: find the max)')
其中action参数的'store_const'指的是:触发action时的动作为sum,默认值是输出max(???待确认)。
$python prog.py 1 2 3 4 #1,2,3,4是为位置参数,必须有的(但是怎么从参数中确认这个参数的个数是应该是多少个呢?)
4 #默认是输出最大值
$python prog.py 1 2 3 4 --sum
10 #加了可选参数之后,是进行求和运算
//1216更新学习到此,此后继学习这一模块
1217更新:
解析参数
如例子:
parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('integers', metavar='N', type=int, nargs='+',
help='an integer for the accumulator')
parser.add_argument('--sum', dest='accumulate', action='store_const',
const=sum, default=max,
help='sum the integers (default: find the max)')
parser.add_argument('--foo', help='foo help')
ArgumentParser 通过 parse_args() 方法解析参数。它将检查命令行,把每个参数转换为适当的类型然后调用相应的操作。
# args = parser.parse_args(['--sum', '7', '-1', '42']) #如果此处已经写好了参数,则直接获取这里面的参数执行--sum,而不从命令行读取,即使执行脚本是输出了其他数字进行--sum,输出结果为48
args = parser.parse_args() # 但是通常情况下,parse_args() 会被不带参数调用,而 ArgumentParser 将自动从 sys.argv 中确定命令行参数,这是命令行参数生效。
print(args.accumulate(args.integers))
ArgumentParser 对象学习
class argparse.ArgumentParser(prog=None, usage=None, description=None, epilog=None, parents=[ ], formatter_class=argparse.HelpFormatter, prefix_chars='-', fromfile_prefix_chars=None, argument_default=None, conflict_handler='error', add_help=True, allow_abbrev=True, exit_on_error=True)
prog:表示在显示帮助信息的的程序的名字,默认值是sys.argv[0](我理解的应该就是脚本的名字),但是如果在创建这个对象的时候定义了prog的值,如prog="ArgparseLearning",则执行这个脚本的时候 --help显示的名字将是ArgparseLearning:
parser = argparse.ArgumentParser(description='Process some integers.',prog="ArgparseLearning")
要想在其他地方引用prog设置的值,无论是从 sys.argv[0] 或是从 prog= 参数确定的程序名称,都可以在帮助消息(help参数)里通过 %(prog)s 格式串来引用。
parser.add_argument('--foo', help='foo of the %(prog)s program')
--help脚本是显示:
usage:默认情况下,ArgumentParser 根据它包含的参数来构建用法消息:这个从以上的几个截图可以看出来。可以使用自行定义usage关键字来覆盖默认值。例如:
parser = argparse.ArgumentParser(description='Process some integers.',prog="ArgparseLearning", usage='%(prog)s [-h][--sum][--foo]')
运行脚本显示:
description:大多数对 ArgumentParser 构造方法的调用都会使用 description= 关键字参数。这个参数简要描述这个程度做什么以及怎么做。在帮助消息中,这个描述会显示在命令行用法字符串和各种参数的帮助消息之间,如以上的一些截图,不在赘述。在默认情况下,description 将被换行以便适应给定的空间。如果想改变这种行为,见 formatter_class 参数。
epilog: 一些程序喜欢在 description 参数后显示额外的对程序的描述。这种文字能够通过给 ArgumentParser:: 提供 epilog= 参数而被指定。
parser = argparse.ArgumentParser(description='Process some integers.',prog="ArgparseLearning", usage='%(prog)s [-h][--sum][--foo]',epilog="just some test msg for epilog param")
运行显示:
parents:有些时候,少数解析器会使用同一系列参数。 单个解析器能够通过提供 parents= 参数给 ArgumentParser 而使用相同的参数而不是重复这些参数的定义。parents= 参数使用 ArgumentParser 对象的列表,从它们那里收集所有的位置和可选的行为,然后将这写行为加到正在构建的 ArgumentParser 对象。请注意大多数父解析器会指定 add_help=False . 否则, ArgumentParse 将会看到两个 -h/--help 选项(一个在父参数中一个在子参数中)并且产生一个错误。使用parent=定义的内容之前,先初始化,在子解析器之后改变父解析器,变化不会应用到子解析器上。
parent_parser = argparse.ArgumentParser(add_help=False)
parent_parser.add_argument('--parent', type=int)
parser = argparse.ArgumentParser(description='Process some integers.',prog="ArgparseLearning", usage='%(prog)s [-h]['--sum][--foo]',epilog="just some test msg for epilog param",parents=[parent_parser])
运行脚本得到://这部分读得不是很懂.....等待高阶用法指点迷津