argparse
是python
标准库中推荐的命令行解析模块。首先看一段代码,之后对其解析:
import math
import argparse
parser = argparse.ArgumentParser(description="Calculate the x**n (x to the power of n)")
parser.add_argument("x", type=int,help="the data x")
parser.add_argument("n", type=int,help="the power of n")
args = parser.parse_args()
def computer_pow(x,n):
res = math.pow(x,n)
print("The Result is: {}".format(res))
return res
if __name__ == "__main__":
computer_pow(args.x, args.n)
首先需要使用import
导入argparse
模块。
import argparse
之后所要做的第一件事情就是创建一个参数解析对象parser
,将其看作一个装载参数的容器即可(description
对这个容器进行解释):
parser = argparse.ArgumentParser(description="Calculate the x**n (x to the power of n)", epilog = 'www.github.com',
prog='myPythonProgram')
这个地方通常可以用来写程序的用法。还可以添加epilog
参数来留一些链接。prog
参数来指定 --help
信息中的程序名称。
设置位置参数
然后可以添加一些参数:
parser.add_argument("x", type=int,help="the data x")
parser.add_argument("n", type=int,help="the power of n")
此处添加的是位置参数,位置参数名称前不要有前缀-
或--
,位置参数必须配置,不然会报错。位置参数在命令行中的出现和配置顺序与代码中参数的定义顺序是对应的。如果定义了多个位置参数,命令行输入参数的时候,顺序要与多个参数的定位顺序保持一致。
之后将设置的所有add_argument
给返回到args
子类实例当中:
args = parser.parse_args()
使用的时候在终端输入对应的参数即可:
设置可选参数
上述描述的是位置参数,当然也可以添加可选参数,并为其设置默认值:
parser.add_argument("--x", type=int,help="the data x", default=2)
parser.add_argument("--n", type=int,help="the power of n", default=3)
凡是用-
或者 --
开头定义的命令行参数,都属于可选参数。这里有一个约定俗成的惯例:单个字母只是用一个 -
,多个字母使用两个 -
。
此时即可直接运行程序,能够得到一样的结果:
在终端运行的话,就不想位置参数那样,每个指定位置需要给定什么参数,我们可以通过flag
随意指定参数:
必选参数
通过设置required=True
,可选参数也可以变成必选参数。必选参数跟位置参数还不一样,必选参数的位置可以比较灵活。
parser.add_argument("--x", type=int,help="the data x", default=2, required=True)
parser.add_argument("--n", type=int,help="the power of n", default=3, required=True)
这样在终端运行时,如果缺少某个参数,你将会很容易发现,如下图所示:
action参数
ArgumentParser
对象的add_argument
函数增加命令行参数,action
用来控制命令行参数的(部分)行为方式。
- 默认action=‘store’:
默认情况下,action='store'
,可以不用写出来,含义是保存输入的值。如果require!=True
,不输出此命令含参数,值为None
:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--moren')
args = parser.parse_args()
print(args.moren)
$ python3 arg_action.py
None
$ python3 arg_action.py --moren www.pynote.net
www.pynote.net
- action=‘store_true’ or action=‘store_false’:
store_true
表示如果配置,值为True
,store_false
表示如果配置,值为False
。这两个action
也很常用,此时命令行参数后面不能配置具体的值。
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--zhenjia', action='store_true')
args = parser.parse_args()
print(args.zhenjia)
$ python3 arg_action.py --zhenjia
True
- action=‘store_const’
当命令行参数的action='store_const'
时,如果配置,它的值为add_argument
函数的const
参数提供。用const
参数来提供某个命令行参数的默认值:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--const', action='store_const', const=123)
args = parser.parse_args()
print(args.const)
$ python3 arg_action.py --const
123
- action=‘append’
将命令行参数值放入list
对象中,并且,允许命令行参数多次出现:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--tolist', action='append')
args = parser.parse_args()
print(args.tolist)
$ python3 arg_action.py --tolist 1 --tolist 2 --tolist 3
['1', '2', '3']
与nargs
参数实现类似,但是nargs
不允许同一个命令行参数多次出现
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--three', nargs=3, required=True)
args = parser.parse_args()
print(args.three)
# E:\py>python arg.py --three 1 2 3
# ['1', '2', '3']
#
# E:\py>python arg.py --three 1 2 3 4 5
# usage: arg.py [-h] --three THREE THREE THREE
# arg.py: error: unrecognized arguments: 4 5
#
# E:\py>python arg.py --three 1 2
# usage: arg.py [-h] --three THREE THREE THREE
# arg.py: error: argument --three: expected 3 arguments
配合上nargs='+'
参数,嵌套多个list
的效果如下:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--tolist', action='append', nargs='+')
args = parser.parse_args()
print(args.tolist)
# $ python3 arg_action.py --tolist 1 2 --tolist 3 4 5 --tolist 6 7
# [['1', '2'], ['3', '4', '5'], ['6', '7']]
- action=‘extend’ (python-3.8)
在action='append'
时,多次出现的同一个命令行参数,参数值保存成了嵌套list
的形式。action='extend'
优化了此问题,让多个list
以extend
的方式合并成一个list:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--onelist', action='extend', nargs='+')
parser.add_argument('-V', action='version', version='pynote.net V1.2345')
args = parser.parse_args()
print(args.onelist)
# $ python3 arg_action.py --onelist 1 2 3 --onelist 4 5 6
# ['1', '2', '3', '4', '5', '6']
- action=‘count’
这个action
用来统计命令行参数出现的次数,出现次数不同,含义也不一样:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-c', '--cc', action='count')
args = parser.parse_args()
print(args.cc)
# $ python3 arg_action.py -c
# 1
# $ python3 arg_action.py -ccccc
# 5
# $ python3 arg_action.py --cc --cc --cc
# 3
type参数
type
参数用来指定参数的类型,上文已有初步使用介绍,这里介绍通过type
设置任意类型:
import argparse
def take1byte(string):
"""change one-hex-byte to a real byte number"""
check_list = ['0','1','2','3','4','5','6','7','8','9',
'A','B','C','D','E','F']
if (len(string) != 4 or
string[0:2] != '0x' or
string[2] not in check_list or
string [3] not in check_list):
msg = 'Not a valid one-hex-byte with 0x prefix, in upper case.'
raise argparse.ArgumentTypeError(msg)
return int(string[2:],16)
parser = argparse.ArgumentParser()
parser.add_argument('--hex', required=True, type=take1byte)
args = parser.parse_args()
print('your input number is :', str(args.hex))
# E:\py>python arg.py --hex=0x10
# your input number is : 16
# E:\py>python arg.py --hex=0xAA
# your input number is : 170
# E:\py>python arg.py --hex=0xFF
# your input number is : 255
# E:\py>python arg.py --hex=FF
# usage: arg.py [-h] --hex HEX
# arg.py: error: argument --hex: Not a valid one-hex-byte with 0x prefix, in upper case.
互斥参数
所谓互斥参数,就是在某几个参数中,用户只能在其中选择一个
def main():
parser = argparse.ArgumentParser()
timeType = parser.add_mutually_exclusive_group(required=True)
timeType.add_argument('--day', type=int,
help='keep the last x days files')
timeType.add_argument('--month', type=int,
help='keep the last x months files')
timeType.add_argument('--year', type=int,
help='keep the last x years files')
args = parser.parse_args()
if __name__ == '__main__':
main()
通过ArgumentParser
对象的add_mutually_exclusive_group
函数,定义一个group
,以上代码这个group
的名称是timeType
。然后在这个group
中再通过add_argument
函数增加具体的命令行参数,凡是在这个timeType
中增加的命令行参数,相互直接就是互斥参数!即--day
,--month
和--year
这三个参数,只能同时在命令行中存在一个。
choices给参数设置范围
可以通过此参数来给命令行参数的取值设置一个任意的范围。
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--cc', type=int, choices=[1,2,3])
args = parser.parse_args()
choices
内的元素类型要与type
保持一致,默认为字符串。
metavar参数
metavar
参数,用来控制部分命令行参数的显示,注意:它只是影响部分参数的显示信息,不影响代码内部获取命令行参数的对象
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', metavar='YYY')
>>> parser.add_argument('bar', metavar='XXX')
>>> parser.parse_args('X --foo Y'.split())
Namespace(bar='X', foo='Y')
>>> parser.print_help()
usage: [-h] [--foo YYY] XXX
positional arguments:
XXX
optional arguments:
-h, --help show this help message and exit
--foo YYY
dest参数
dest
参数,用来给parse_args()
函数返回的对象属性命名的。如果不用dest
参数,对于可选参数的引用属性名称,优先选择 --
开头的那个,如果没有,用 -
开头的那个字母:
>>> import argparse
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('-a', '--apple')
_StoreAction(option_strings=['-a', '--apple'], dest='apple', nargs=None, const=None, default=None, type=None, choices=None, help=None, metavar=None)
>>> parser.add_argument('-b')
_StoreAction(option_strings=['-b'], dest='b', nargs=None, const=None, default=None, type=None, choices=None, help=None, metavar=None)
-a
参数的dest='apple'
;-b
参数的dest='b'
。
用dest
参数的效果:
>>> parser.add_argument('-c', dest='cpp')
_StoreAction(option_strings=['-c'], dest='cpp', nargs=None, const=None, default=None, type=None, choices=None, help=None, metavar=None)
-c
参数的dest='cpp'
。
我的微信公众号名称:小小何先生
公众号介绍:主要研究分享深度学习、机器博弈、强化学习等相关内容!期待您的关注,欢迎一起学习交流进步!