python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python自定义命令行

Python自定义命令行参数选项和解析器

作者:信橙则灵

这篇文章主要介绍了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 时展示提示信息。如下图所示:

在这里插入图片描述

第10、14行:给parser添加属性,重点介绍 action 这个参数

相同点:

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

区别:

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

第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 参数,它们可被用来定制显示内容

是不是有点迷糊, 其实就是自定义一个参数分组,如下图所示:

在这里插入图片描述

第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自定义命令行参数选项和解析器的文章就介绍到这了,更多相关Python自定义命令行内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文