Python——ArgumentParser类的使用


整体说明

  • 在 Python 里,argparse.ArgumentParser() 是标准库 argparse 模块的核心部分,其主要功能是解析命令行参数
  • 大部分优秀的开源函数都会使用这个功能

代码示例

  • ArgumentParser类使用示例
    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    import argparse

    def main():
    # 创建 ArgumentParser 对象
    parser = argparse.ArgumentParser(
    description='这是一个命令行工具演示程序',
    epilog='示例: python demo.py -n Alice -a 35 --verbose'
    )

    # 添加参数
    # 位置参数 (未添加-为前缀的是位置参数,位置参数是必须给出的)
    parser.add_argument('input_file', help='输入文件路径')

    # 可选参数(添加-或--的是可选参数),同一行可以同时注册-或--,都可以作为输入参数
    # # 但代码内部名字命名规则是--优先-,没有--时,代码内部-才会生效(比如下面的定义下,parser.output 和 parser.x 生效,但是 parser.o 会报错)
    parser.add_argument('-o', '--output', default='output/result.txt', help='输出文件路径') # 调用时使用args.output调用参数
    parser.add_argument('-x', help='x') # 调用时使用args.x调用参数
    parser.add_argument('-n', '--name', default='Guest', help='用户名称') # 调用时使用args.x调用参数
    parser.add_argument('--age', type=int, choices=range(30, 40), help='用户年龄(30-39)')
    # action='store_true'表示这是布尔变量,若传入命令行存在该参数,则该 Python 参数值为 true,否则为 false;'store_false' 则功能相反
    parser.add_argument('--verbose', action='store_true', help='显示详细输出')
    parser.add_argument('--color', choices=['red', 'green', 'blue'], default='blue', help='颜色选择')
    parser.add_argument('--scale', type=float, default=*0, help='缩放比例')

    # 互斥参数组,同时指定会出错
    group = parser.add_mutually_exclusive_group()
    group.add_argument('--fast', action='store_true', help='快速模式')
    group.add_argument('--slow', action='store_true', help='慢速模式')

    # * 解析参数
    args = parser.parse_args()

    print("args对象完整属性:", args.__dict__)
    print("--end--\n")
    # * 使用参数
    print(f"输入文件: {args.input_file}")
    if args.output:
    print(f"输出文件: {args.output}")
    print(f"用户名: {args.name}")
    if args.age:
    print(f"年龄: {args.age}")
    print(f"详细模式: {'是' if args.verbose else '否'}")
    print(f"颜色: {args.color}")
    print(f"缩放比例: {args.scale}")
    if args.fast:
    print("模式: 快速")
    elif args.slow:
    print("模式: 慢速")
    else:
    print("模式: 默认")


    if __name__ == '__main__':
    main()

    # args对象完整属性: {'input_file': 'text.txt', 'output': 'output/result.txt', 'x': None, 'name': 'Guest', 'age': 33, 'verbose': False, 'color': 'blue', 'scale': *0, 'fast': False, 'slow': False}
    # --end--
    #
    # 输入文件: text.txt
    # 输出文件: output/result.txt
    # 用户名: Guest
    # 年龄: 33
    # 详细模式: 否
    # 颜色: blue
    # 缩放比例: *0
    # 模式: 默认

Python 内部变量参数命名规则

  • --- 同时存在时,优先 -- 定义的变量
    • 注:传入时都可以使用,且没有优先级,只会用后面的覆盖前面的
  • --output-path 等会自动被转换成 parser.output_path 变量访问
    • 注:传入时还是必须跟参数定义方式对齐 --output-path
    • 当然:--output_path 也是相同的参数名 parser.output_path ,若同时定义了 --output_path--output-path,则两者实际上是同一个参数,且互相之间可以被覆盖

ArgumentParser 类其他使用注意事项

  • 参数类型
    • 默认情况下参数是字符串类型,可以使用 type 指定其他类型
    • 常用类型:int, float, str (默认)
  • 参数种类
    • 位置参数:没有前缀,必须提供
    • 可选参数:以 --- 开头,可选提供
    • 注:位置参数是必须的,可选参数可通过增加 required=True 来设定为必须参数
  • 常用参数选项
    • help:参数的帮助信息
    • default:参数的默认值
    • choices:限制参数的取值范围
    • action:参数的动作,常见值:
      • store:存储参数值(默认)
      • store_true/store_false:存储布尔值
      • append:允许多次使用参数并存储为列表
  • 互斥参数
    • 使用 add_mutually_exclusive_group() 创建互斥组
    • 组内的参数不能同时使用
  • 帮助信息
    • description:程序的简要描述
    • epilog:帮助信息末尾的文本
    • 自动生成的帮助信息可以通过 -h--help 查看
  • 错误处理
    • 当用户输入无效参数时,argparse 会自动生成错误信息并退出,会抛出 ArgumentErrorSystemExit 异常
  • 子命令
    • 对于复杂的命令行工具,可以使用 add_subparsers() 实现子命令功能
    • 类似 gitcommit, push 等子命令
  • 参数前缀
    • 通常单字母参数用 - 前缀,完整单词用 -- 前缀
    • 但这不是强制要求,只是约定俗成