python学习笔记06:命令行参数
1. 使用步骤
使用步骤如下:
# 导入模块
import argparse
# 获取parser, description文本会显示在help信息中
parser = argparse.ArgumentParser(description='args discrip')
# 添加选项, 具体选项类型见后面各节
parser.add_argument('-a')
# 解析选项
args = parser.parse_args(sys.argv[1:])
# 使用选项
print(args.a)
对sys.argv[1:]的说明:
sys.argv # 一个列表,存储命令行参数.
sys.argv[0] # 脚本名.
sys.argv[1:] # 命令行参数.
sys.argv[1][2:] # 截取第一个参数第2bit之后的内容;
2. 位置参数
# 位置参数可以实现类似于vcs a.v b.v的选项处理,
# 如下例, vfiles是位置参数,不需要使用'-vfile 或者-xx'这种形式指定选项内容;
# default=[] 表示默认参数为空list;
# nargs='*' 表示可以是0个或多个参数;
>>> parser.add_argument('vfiles', type=str,default=[], nargs='*')
_StoreAction(optine_strings=[], dest='vfiles', nargs='*', const=None, default=[], Type=<class 'str'>, choices=None, help=None, metavar=None)
3. flag类型的选项(选项本身无参数)
flag类型选项本身无参数, 根据"命令行是否有该选项" 和 "该选项声明值/默认值" 来决定选项实际值(注意, 并不是声明选项, 则该选项为True, 不声明为False, 而是内部可配置):
>>> parser.add_argument(
... '-a', # 选项名称
... action='store_true', # 如果声明-a, 则a=True;
... default=False # 如果不声明-a, 则(默认)a=False;
... )
_StoreTrueAction(optine_strings=['-a'], dest='a', nargs=0, const=True, default=False, Type=None, choices=None, help=None, metavar=None)
>>>
>>> parser.add_argument(
... '-b',
... '--b_long_opt', # b有额外的长选项名称: --b_long_opt
... action='store_false', # 如果声明-b, 则b=False
... default=True, # 如果不声明(默认)-b, 则b=True
... dest='b_new_name' # 内部使用b_new_name取用该选项(而不能使用b)
)
_StoreTrueAction(optine_strings=['-b', '--b_long_opt'], dest='b_new_name', nargs=0, const=False, default=True, Type=None, choices=None, help=None, metavar=None)
注意,不会有以下两种情况,因为这两种情况下,无论选项是否定义,内部得到的值都一样,没有意义;
>>> # action='store_true', default=True,声明选项和默认值都是True
>>> # action='store_false', default=False,声明选项和默认值都是False
通过parse一个内部数组来进行验证,实际使用中是parse真正的命令行数组sys.argv[1:], 注意sys.argv[0]表示的是脚本名称;
测试1:#-a -b都没声明,所以都是default值
>>> lst_args=[]
>>> args = parser.parse_args(lst_args)
>>> args.a # 未声名-a,所以args.a的值为default值False;
False
>>> args.b_new_name # 未声名-b,所以args.b_new_name值为默认值True;
True
>>> args.b # 由于使用了dest, 所以args.b会报错, 只能使用args.b_new_name获取
AttributeError: 'Namespace' object has no sttribute 'b'
测试2:-a -b都声明,所以都是action store值
>>> lst_args=['-ab'] # -a和-b是短选项, 可以合并使用'-ab'表示'-a' '-b'
>>> args = parser.parse_args(lst_args)
>>> args.a # 声名了-a,所以args.a的值为声明值True;
True
>>> args.b_new_name # 声名了-b,所以args.b_new_name值为声明值False;
False
测试3:使用长选项,-a -b都声明,所以都是store值
>>> lst_args=['-a', '--b_long_opt'] # --b_long_opt是长选项, 需要使用双短线('--')进行声明
>>> args = parser.parse_args(lst_args)
>>> args.a # 声名了-a,所以args.a的值为声明值True;
True
>>> args.b_new_name # 声名了-b,所以args.b_new_name值为声明值False;
False
4. 必选选项(选项必须声明, 不声明会报错)
>>> parser.add_argument(
... '-c', # 选项名称
... type=int, # 选项类型是整数
... required=True # 选项是必选选项
)
_StoreAction(optine_strings=['-c'], dest='c', nargs=None, const=None, default=None, Type=<class 'int'>, choices=None, help=None, metavar=None)
>>>
>>> # 选项-c必须声明,否则报错:error:the following argument are required:-c
>>> lst_args=['-c', '3']
>>> args = parser.parse_args(lst_args)
>>>
>>> # 选项-c类型为int,所以str '3'传到args.c时,会转类型为int 3;
>>> print(args.c)
3
5. 可选选项,可带默认值
-d 为str类型的可选选项,默认值为'default_d'
-d 为str类型的可选选项,默认值为'default_d'
>>> parser.add_argument(
... '-d', # 选项名
... type = str, # 选项类型
... required = False, # '-d'是可选选项
... default = 'default_d' # '-d'不声明时, 默认值为'default_d'
)
_StoreTrueAction(optine_strings=['-d'], dest='d', nargs=None, const=None, default='default_d', Type=<class 'int'>, choices=None, help=None, metavar=None)
>>>
>>> lst_args=['-c', '4', '-d', '5'] # -c 必选, -d 可选
>>> args = parser.parse_args(lst_args)
>>> args.c # 选项-c为必选,类型为int
4
>>> type(args.c)
<class 'int'>
>>>
>>> args.d # 选项-d为可选,类型为str
'5'
>>> type(args.d)
<class 'str'>
6. 长选项
>>> parser.add_argument(
... '--e_long_opt' , # 表示长选项
... type=str , #
... required=False , #
... default=[] , #
... nargs='+' , # 表示--e_long_opt这个选项后面可以有多个参数
)
_StoreTrueAction(optine_strings=['--e_long_opt'], dest='e_long_opt', nargs='+', const=None, default=[], Type=<class 'str'>, choices=None, help=None, metavar=None)
>>>
>>> # --e_long_opt 带了两个参数 'opt_e0', 'opt_e1'
>>> lst_args=['-c', '4', '--e_long_opt', 'opt_e0', 'opt_e1']
>>>
>>> args = parser.parse_args(lst_args)
>>>
>>> # --e_long_opt的两个参数组成一个list赋值给args.e_long_opt;
>>> args.e_long_opt
['opt_e0', 'opt_e1']
7. 列表选项
nargs='+' 表示当前选项可以有多个参数, 这些参数组成一个list, 例子见上一节.
8. 未知选项
如果sys.argv[1:]中出现了"位置选项123" 或 "命名选项–f 456",但"123" 或"-f"选项没有定义在add_argument()中时,直接使用parser.parse_args()会报告错误:
error: unrecognized arguments: 123 –f 456;
这时需要使用parser.parse_known_args()这个方法(而不是parser.parse_args()这个方法)。
>>> lst_args = ['-a', '123', '-f', '456']
>>> parser.add_argument('-a', action='store_true',default=False)
>>>
>>> args, unknown_args = parser.parse_known_args(lst_args)
>>>
>>> args
Namespace(a=True)
>>> args.a # args得到的值与parser.parse_args()的返回值一致
True
>>>
>>> unknown_args # unknown_args得到的是处理完定义过的args后,剩下的选项;
['123', '-f', '456']