• python argparse 库


    argparse — 命令行选项、参数和子命令解析器

    介绍

    官方文档:https://docs.python.org/zh-cn/3/library/argparse.html

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

    这个库在我们写一些安全工具的时候,比较好用并且这是一个内置库,可以简化我们的代码,和传入参数的调用,生成我们需要的使用说明。

    我这里就介绍一下简单的使用,要想要深入的了解可以参考官方文档。

    如何简单的使用

    这个库的使用分为三步:

    1. 创建一个解析器
    2. 添加参数
    3. 解析参数

    简单示例:

    import argparse
    
    def sum(a, b):
        return a + b
    
    if __name__ == '__main__':
        # 创建一个解析器
        parse = argparse.ArgumentParser()
        # 添加参数
        parse.add_argument("-num1", type=int, help="数字1")
        parse.add_argument("-num2", type=int, help="数字2")
        # 解析参数
        args = parse.parse_args()
    
        # args.num1 获取 -num1的值
        print(sum(args.num1, args.num2)) # 30
        
    # 使用命令调用 python nmae.py -num1 10 -num2 20
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    这样我们就完成了 argparse 的简单使用,想要写一个让人心情愉悦的安全工具这样肯定是不行的,我们还需要了解更多的参数来自定义我们的命令解析器。

    ArgumentParser 对象

    创建一个新的 ArgumentParser对象。所有的参数都应当作为关键字参数传入。每个参数在下面都有它更详细的描述,但简而言之,它们是:

    参数说明
    prog程序的名称 (默认值: os.path.basename(sys.argv[0]))
    usage描述程序用途的字符串(默认值:从添加到解析器的参数生成)
    description在参数帮助文档之前显示的文本(默认值:无),可以用来说明程序的作用
    epilog在参数帮助文档之后显示的文本(默认值:无),同上
    parents一个 ArgumentParser 对象的列表,它们的参数也应包含在内
    formatter_class用于自定义帮助文档输出格式的类
    prefix_chars可选参数的前缀字符集合(默认值: ‘-’)
    fromfile_prefix_chars当需要从文件中读取其他参数时,用于标识文件名的前缀字符集合(默认值: None
    argument_default参数的全局默认值(默认值: None
    conflict_handler解决冲突选项的策略(通常是不必要的)
    add_help为解析器添加一个 -h/--help 选项(默认值: True
    allow_abbrev如果缩写是无歧义的,则允许缩写长选项 (默认值:True
    exit_on_error决定当错误发生时是否让 ArgumentParser 附带错误信息退出。 (默认值: True)

    在 3.5 版更改: 增加了 allow_abbrev 参数。

    在 3.8 版更改: 在之前的版本中,allow_abbrev 还会禁用短旗标分组,例如 -vv 表示为 -v -v

    在 3.9 版更改: 添加了 exit_on_error 形参。

    上面的参数我们不用全部记住,只需要记住几个常用的参数就行了,我们来优化一下我们示例的代码:

    我们使用 description 参数添加一个程序说明:

    import argparse
    
    parse = argparse.ArgumentParser(description="用来进行加减乘除的运算")
    
    • 1
    • 2
    • 3

    add_argument() 方法

    定义单个的命令行参数应当如何解析。每个形参都在下面有它自己更多的描述,长话短说有:

    参数说明
    name or flags一个命名或者一个选项字符串的列表,例如 foo-f, --foo
    action当参数在命令行中出现时使用的动作基本类型
    nargs命令行参数应当消耗的数目
    const被一些 actionnargs选择所需求的常数
    default当参数未在命令行中出现并且也不存在于命名空间对象时所产生的默认值
    type命令行参数应当被转换成的类型
    choices可用的参数的容器
    required此命令行选项是否可省略 (仅选项可用)
    help一个此选项作用的简单描述
    metavar在使用方法消息中使用的参数值示例
    dest被添加到 parse_args()所返回对象上的属性名

    同样的我们不需要全部都记住,我们只需要记住几个常用的参数即可,其中值得注意的是以下两个参数的使用:

    • action:action 命名参数指定了这个命令行参数应当如何处理,以下介绍几个常用的参数。

      store_true and store_false:用来表示bool值,值得注意的是它们的默认值分别为 FalseTrue

      append:存储一个列表,并且将每个参数值追加到列表中

      extend:这会存储一个列表,并将每个参数值加入到列表中,值得注意的是 一定要配合 nargs="+"使用。

    • nargs:nargs 命名参数关联不同数目的命令行参数到单一动作。

    *nargs='?' :的一个更普遍用法是允许可选的输入或输出文件:

    '*':所有当前命令行参数被聚集到一个列表中。

    '+':和 '*' 类似,所有当前命令行参数被聚集到一个列表中。

    我们使用 add_argument() 方法添加两个命令行参数丰富我们之前的代码:

    import argparse
    
    parse = argparse.ArgumentParser(description="用来进行加减乘除的运算")
    parse.add_argument(name="-sum", action="extend", nargs="+", help="输入两个数字进行加法运算")
    parse.add_argument(name="-sub", action="extend", nargs="+", help="输入两个数字进行减法运算")
    
    • 1
    • 2
    • 3
    • 4
    • 5

    parse_args() 方法

    将参数字符串转换为对象并将其设为命名空间的属性。 返回带有成员的命名空间。

    对于这个方法,没有什么补充的,使用方法也很简单,如下:

    import argparse
    
    parse = argparse.ArgumentParser(description="用来进行加减乘除的运算")
    parse.add_argument(name="-sum", action="extend", nargs="+", help="输入两个数字进行加法运算")
    parse.add_argument(name="-sub", action="extend", nargs="+", help="输入两个数字进行减法运算")
    # 
    args = parser.parse_args()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    如何获取我们输入的值

    import argparse
    
    parse = argparse.ArgumentParser(description="用来进行加减乘除的运算")
    parse.add_argument(name="-sum", action="extend", nargs="+", help="输入两个数字进行加法运算")
    parse.add_argument(name="-sub", action="extend", nargs="+", help="输入两个数字进行减法运算")
    
    args = parser.parse_args()
    
    # 直接使用 aegs.参数名就可以调用输入的值
    a = args.sum
    # 如果存在输入多个值,可以使用 aegs.参数名[1] 的方式获得我们需要的值
    b = args.sum[0]
    c = args.sum[1]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    代码示例

    现在我们来完成我们上面的一个简单代码,实现两位数的加减乘除:

    import argparse
    
    
    # 加法
    def sum(a, b):
        return a + b
    
    
    # 减法
    def sub(a, b):
        return a - b
    
    
    # 乘法
    def chenfa(a, b):
        return a * b
    
    
    # 除法
    def chufa(a, b):
        return a / b
    
    
    if __name__ == '__main__':
        # 创建一个解析器
        parse = argparse.ArgumentParser(description="一个简单的加减乘除的运算程序!")
        # 添加参数
        parse.add_argument("-sum", type=int, action="extend", nargs="+", help="输入要进行加法的数字", )
        parse.add_argument("-sub", type=int, action="extend", nargs="+", help="输入要进行减法的数字")
        parse.add_argument("-chenfa", type=int, action="extend", nargs="+", help="输入要进行乘法的数字")
        parse.add_argument("-chufa", type=int, action="extend", nargs="+", help="输入要进行除法的数字")
        # 解析参数
        args = parse.parse_args()
        
        # 判断使用了哪些算法
        if args.sum != None:
            print(f"{args.sum[0]} + {args.sum[1]} = {sum(args.sum[0], args.sum[1])}")
    
        elif args.sub != None:
            print(f"{args.sub[0]} - {args.sub[1]} = {sum(args.sub[0], args.sub[1])}")
    
        elif args.chenfa != None:
            print(f"{args.chenfa[0]} * {args.chenfa[1]} = {sum(args.chenfa[0], args.chenfa[1])}")
    
        elif args.chufa != None:
            print(f"{args.chufa[0]} / {args.chufa[1]} = {sum(args.chufa[0], args.chufa[1])}")
    
        else:
            print("请输入正确的参数和参数值进行运算!")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49

    其中值得注意的是如果没有在命令行中调用参数,如 args.sum 的返回结果是 None

    这个库还有很多的内容是我没有讲到的,我只是讲了一下简单的运用。如果有需要或者兴趣可以去官方文档中查看相应的应用。

  • 相关阅读:
    学习SpringSecurity这一篇就够了
    【技术美术知识储备】纹理基础2.0-凹凸映射
    设计模式之门面模式
    Excel 每 N 行拼成一行
    【计算思维题】少儿编程 蓝桥杯青少组计算思维 数学逻辑思维真题详细解析第10套
    指针和数组笔试题解析
    linux常用网址
    halcon分割粘连字符
    科技与教育的盛宴——探讨监控易在82届教装展的新机遇
    若依管理框架-漏洞复现
  • 原文地址:https://blog.csdn.net/qq_53742230/article/details/126724724