Python自定义命令行参数 --> argparse.ArgumentParser() 命令行选项、参数和子命令解析器

Python自定义命令行参数

使用到的方法为 argparse.ArgumentParser() ,此模块有中文文档,建议链接 到官方中文文档中查看。

argparse.ArgumentParser()

此模块可以让人轻松编写用户友好的命令行接口。程序定义它需要的参数,然后 argparse 将弄清如何从 sys.argv 解析出那些参数。 argparse 模块还会自动生成帮助和使用手册「常见的-h」,并在用户给程序传入无效参数时报出错误信息。

使用流程

1、创建一个解析器:

第一步:创建一个 ArgumentParser 对象:

parser = argparse.ArgumentParser(description='Process some integers.')

ArgumentParser 对象包含将命令行解析成 Python 数据类型所需的全部信息。
备注:想知道具体信息可点击类,查看其中的源码

2、添加参数:

ArgumentParser 对象添加参数的方法为:add_argument()

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)')     

调用 parse_args() 将返回一个具有integers和 accumulate 属性的对象,integers 属性将是一个包含一个或多个整数的列表。而accumulate属性,当传递的参数为–sum时,则是求和「sum() 函数」,当不传参时,默认求最大值「max()函数」

3、解析参数:

ArgumentParser 对象通过 parse_args() 方法解析参数,它将检查命令行,把每个参数转换为适当的类型然后调用相应的操作。
parser.parse_args([’–sum’, ‘7’, ‘-1’, ‘42’])
返回为:Namespace(accumulate=, integers=[7, -1, 42])

上面是官网的例子,其实简而言之就四个步骤:

1、导入模块

import argparse

2、创建对象

 parser = argparse.ArgumentParser(description='描述',  usage = "传参提示")

3、添加对象属性

parser.add_argument()

4、解析参数

parser.parse_args()   或者  parser.parse_known_args() 
下面的内容会讲到这两者的区别

至于具体的参数怎么使用,建议参考官网,本人还未参透所有参数,(。・_・。)ノI’m sorry~,不过已够工作使用,待日后慢慢补充。

工作中的使用:

先上代码,下面有具体的代码解析,研究透这些,就够日常基本使用了

import argparse

parser = argparse.ArgumentParser()


def arg_parser():
    parser = argparse.ArgumentParser(
        usage="usage: %(prog)s [参数名] [参数值]"
    )
    parser.add_argument(
        "--welcome", help="是否展示欢迎词", action='store_true'
    )
    parser.add_argument(
        "--login", help="是否登录", action='store_true', default=True
    )
    parser.add_argument(
        "--login_token", help="登录参数", default=None, type=str
    )

    model_name = parser.add_argument_group("Model", "使用什么模型处理数据?")
    model_name.add_argument(
        "--knn", help="使用KNN方法",
        type=str, default=None
    )
    model_name.add_argument(
        "--tree", help="使用决策树方法",
        type=str, default=None
    )
    return parser


def argument_parser() -> argparse.ArgumentParser:
    """
    Construct an return an `argparse.ArgumentParser` instance
    """
    return arg_parser()


if __name__ == '__main__':
    parser = argument_parser()
    options, argv_rest = parser.parse_known_args()
    if options.knn is not None:
        argv_rest = ["-knn", options.knn] + argv_rest

    if options.login_token is not None:
        print('login_token参数为:', options.login_token)

    options = options
    arguments = argv_rest
    print('options为:', options, '\n', "arguments为:", arguments)

第7行:定义parser,参数中的usage是介绍使用参数的格式,用于用户在运行 -h 时展示提示信息。如下图所示:
Python自定义命令行参数 --> argparse.ArgumentParser() 命令行选项、参数和子命令解析器_第1张图片
第10、14行:给parser添加属性,重点介绍 action 这个参数

相同点:

  第10行和第14行均是action = ‘store_true’,此参数用于布尔类型的参数  

区别:

  第10行中,当命令行中触发welcome参数时,返回为True,没有触发的时候返回False。
  第14行中,当命令行中触发login参数时,返回为True,没有触发的时候取默认值返回仍为True。也就是说,传不传login参数,返回的都是True,这就是default参数的作用。

action其他参数请参考: https://blog.csdn.net/tsinghuahui/article/details/89279152

第16行

新增login_token参数,传入登录参数token,限制token类型为str,默认为None

提醒一句,这个type不要和action结合使用,action返回的只有布尔类型,注意参数名字大小写是不同的。

第20行:
       add_argument_group(title=None, description=None)方法:
官方解释:

      add_argument_group() 方法返回一个具有 add_argument() 方法的参数分组对象,这与常规的ArgumentParser一样。当一个参数被加入分组时,解析器会将它视为一个正常的参数,但是会在不同的帮助消息分组中显示该参数。
add_argument_group()方法接受 title 和 description 参数,它们可被用来定制显示内容

是不是有点迷糊, 其实就是自定义一个参数分组,如下图所示:
Python自定义命令行参数 --> argparse.ArgumentParser() 命令行选项、参数和子命令解析器_第2张图片

第41行
      parser.parse_known_args() 和 parser.parse_args() 的区别
            options用来接收命令行中已定义了参数的信息
            argv_rest 接收在命令中未被定义的信息

作用:有时一个脚本可能只解析部分命令行参数,而将其余的参数继续传递给另一个脚本或程序,它的作用方式很类似 parse_args() 但区别在于当存在额外参数时它不会产生错误,额外的参数被argv_rest给接收了。

使用:好比在PyQt中,像定义style这种,就可将参数赋给argv_rest,然后让系统「QApplication」去处理此参数

第42行

假如当命令行中的参数中有knn这个参数,而这个参数我想交给系统去处理,所以我就把它添加到argv_rest之中,将这种参数,统一交给系统处理

第45行

传入的参数中存在login_token,对login_token进行单独处理。

以上,是我的粗略了解,有问题的大家评论区留言,知无不言,言无不尽。感觉不错的话,别忘了点赞收藏哦!
Python自定义命令行参数 --> argparse.ArgumentParser() 命令行选项、参数和子命令解析器_第3张图片

你可能感兴趣的:(Python,常用模块,python)