本文的示例代码文件名为tem.py
。
以如下代码为例:
import argparse
if __name__=="__main__":
parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('--num', action='store_const', const=10)
parser.add_argument('integer', type=int)
parser.print_help()
在cmd中运行py tem.py
,显示:
usage: tem.py [-h] [--num] integer
Process some integers.
positional arguments:
integer
optional arguments:
-h, --help show this help message and exit
--num
可以看出,代码中integer为positional arguments,num为optional arguments。
二者的差别在于参数有没有前缀“-”。
那么前缀“-”与前缀“–”有什么差别呢?
import argparse
if __name__=="__main__":
parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('-num','--n', action='store_const', const=10)
args = parser.parse_args()
print(args)
在cmd中运行py tem.py
,输出为:
Namespace(n=None)
运行py tem.py -num
或py tem.py --n
,输出为:
Namespace(n=10)
可见,当有多个字符串时,参数的识别是通过“–”,而不是字符串的长度。
类似的,如果有多个相同前缀(“-”或“–”)的字符串,参数识别为第一个字符串。
parser.add_argument('-num','-n', action='store_const', const=10)
#parser.add_argument('--num','--n', action='store_const', const=10)
#Namespace(num=10)
import argparse
if __name__=="__main__":
parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('--num','-n', action='store_const', const=10)
args = parser.parse_args()
print(args)
'-n’可称为是flag,起作用可为在cmd中方便输入命令,而不会保存为argparse中的参数。
py tem.py -n
#Namespace(num=10)
py tem.py --num
#Namespace(num=10)
import argparse
if __name__=="__main__":
parser = argparse.ArgumentParser()
parser.add_argument('--output', action='store_true')
opt = parser.parse_args()
print(opt)
在cmd输入py tem.py
,则输出:
Namespace(output=False)
注意:如果此语句中设置了default,则cmd运行py tem.py
,该变量值=default。
parser.add_argument("-v", "--verbose", action="store_true",
default=True, help="verbose output")
如果带上参数py tem.py --output
,则输出:
Namespace(output=True)
与 2.1 类似,不再赘述。
import argparse
if __name__=="__main__":
parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('--num', action='store_const', const=10)
args = parser.parse_args()
print(args)
在cmd中运行py tem.py --num
,则输出:
Namespace(num=10)
同样的,如果直接允许py tem.py
,num就会赋值为default(default若未设置,则为None)。
实现效果同3.3,但3.3操作更加方便。
import argparse
if __name__=="__main__":
parser = argparse.ArgumentParser()
parser.add_argument('--ls', action='append', type=int)
opt = parser.parse_args()
print(opt)
在cmd中直接执行py tem.py
:
py tem.py --ls 1 --ls 2
#Namespace(ls=[1, 2])
import argparse
if __name__=="__main__":
parser = argparse.ArgumentParser()
parser.add_argument('--ls', nargs=2, type=int)
opt = parser.parse_args()
print(opt)
该参数只能输入N个值,多或少都会报错。
如N=2,cmd中只为其输入一个值,报错如下:
usage: tem.py [-h] [--ls LS LS]
tem.py: error: argument --ls: expected 2 arguments
parser.add_argument('--ls', nargs='?', type=int)
只解析一个输入参数值,多于1个则报错。
import argparse
if __name__=="__main__":
parser = argparse.ArgumentParser()
parser.add_argument('--ls', nargs='+', type=int)
opt = parser.parse_args()
print(opt)
在cmd中直接执行py tem.py
:
py tem.py --ls 1 2
#Namespace(ls=[1, 2])
nargs='*'
与nargs='+'
效果类似。
若设置required=True
,则cmd中必须输入该参数,否则会产生错误。
parser.add_argument("--pattern","-p", type=str, required=True,default="plane",choices=['plane', 'line'], help="plane:面,line:线")
如果在cmd中直接执行py tem.py
,则会报如下错误:
usage: tem.py [-h] --pattern {plane,line} [-1]
tem.py: error: the following arguments are required: --pattern/-p
若有choices,则在cmd中该参数的值只能从choices中选择,否则会报错:
如cmd中执行py tem.py -p ln
:
usage: tem.py [-h] --pattern {plane,line} [-1]
tem.py: error: argument --pattern/-p: invalid choice: 'ln' (choose from 'plane', 'line')
设置metavar仅为在生成帮助消息parser.print_help()
时,以某种方式来显示预期的形式。
import argparse
if __name__=="__main__":
parser = argparse.ArgumentParser()
parser.add_argument('-xyz', nargs=3)
parser.add_argument('--foo', nargs=2, metavar=('bar', 'baz'))
parser.print_help()
显示如下:
usage: PROG [-h] [-xyz XYZ XYZ XYZ] [--foo bar baz]
optional arguments:
-h, --help show this help message and exit
-xyz XYZ XYZ XYZ
--foo bar baz
Namespace(foo=None, xyz=None)
xyz 参数无metavar,显示为:-xyz XYZ XYZ XYZ
;
而foo 参数设置了metavar,显示为:--foo bar baz
。
用处似乎不大。
在argparse中,参数名默认为:
如:
parser.add_argument('num',action='store_const', const=10)
dest为’num’。
For optional argument actions, the value of dest is normally inferred from the option strings.
ArgumentParser generates the value of dest by taking the first long option string and stripping away the initial -- string.
If no long option strings were supplied, dest will be derived from the first short option string by stripping the initial - character.
Any internal - characters will be converted to _ characters to make sure the string is a valid attribute name.
大致意思和1.2节差不多,不再描述。
而如果设置了dest,则可以自定义参数名。
import argparse
if __name__=="__main__":
parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('-num',dest='n',action='store_const', const=10)
args = parser.parse_args()
print(args)
print(args.n)
print(args.num)
cmd中执行该代码py tem.py -num
,
Namespace(n=10)
10
Traceback (most recent call last):
File "tem.py", line 18, in <module>
print(args.num)
AttributeError: 'Namespace' object has no attribute 'num'
可见参数名已经修改为n,原先的optional argument '-num’不能再作为参数名了。
通过此方法可以把parser 对象变成dict对象。
type(vars(opt))
Out: dict
import argparse
if __name__=="__main__":
parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('-num',dest='n',action='store_const', const=10)
parser.print_help()
args = parser.parse_args()
cmd中运行py tem.py -num
,输出为:
usage: tem.py [-h] [-num]
Process some integers.
optional arguments:
-h, --help show this help message and exit
-num
import argparse
if __name__=="__main__":
parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('-num',dest='n',action='store_const', const=10)
# parser.print_help()
args = parser.parse_args()
cmd中运行py tem.py -h
,输出为:
usage: tem.py [-h] [-num]
Process some integers.
optional arguments:
-h, --help show this help message and exit
-num
[1] https://docs.python.org/zh-cn/3.7/library/argparse.html#module-argparse