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']  
posted @ 2020-07-03 10:42  编程驴子  阅读(211)  评论(0编辑  收藏  举报