欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python之argparse库使用

程序员文章站 2022-03-08 18:50:09
...

引入

  argparse库用于编写用户命令行接口:用户需要定义程序所需的参数,而argparse会自动解析;生成帮助和使用说明,并在输入错误时进行提示。

1 从一个示例开始

  以下示例为数的累加,介绍argparse的基本操作:

import argparse


def test():
    # 初始化
    parser = argparse.ArgumentParser()
    # 添加参数,这里先不解释可选参数、必需参数和位置参数
    # 添加类型为int的integer变量
    parser.add_argument("integer", type=int)
    # 同理
    parser.add_argument("float", type=float)
    # 通过列表的形式传递参数。这里无需传递指定类型的参数,因为argparse会自动识别
    args = parser.parse_args(["1", "2.2"])
    print(args)


if __name__ == '__main__':
    test()

  输出如下:

Namespace(integer=1, float=2.2)

  通过这个示例,需要知道的是如何初始化和参数的传递。
  当然,以下操作也可以在命令行进行 (假设文件名为test.py):

python test.py 1 2.2

  此时将

args = parser.parse_args([“1”, “2.2”])

  写作

args = parser.parse_args()

  也是不会报错的。

2 ArgumentParser对象

  在初始化ArgumentParser对象时,可以传递以下参数:

变量 用途或说明 默认值
prog 程序名称 sys.argv[0]
usage 描述程序的字符串 自动生成
description 使用帮助时,于help之前输出的文本 None
epilog 使用帮助时,于help之后输出的文本 None
parents 包含ArgumentParser对象的列表 []
formatter_class 一个自定义帮助输出的类 None
prefix_chars 可选参数前缀的字符结合 ‘-’
fromfile_prefix_chars 应从中读取附加参数的文件的前缀字符集 None
argument_default 参数的全局默认值 None
conflict_handler 解决冲突选项的策略,通常不必要 “error”
add_help 添加 -h/-help选项 True
allow_abbrev 如果长选项的缩写不模糊,则允许其缩写 True
exit_on_error 确定当程序发生错误时,是否带信息输出 True

  当然很多参数我们平时是用不上的,不过后面依然会介绍到。
  说明:
  1)allow_abbrev:python>=3.5;
  2)exit_on_error:python>=3.9。
  以下着重介绍每一个变量。

2.1 prog

  1)使用默认参数:

import argparse


def test():
    # prog测试
    parser = argparse.ArgumentParser()
    parser.print_help()


if __name__ == '__main__':
    test()

  输出如****意usage后面的文字):

usage: test.py [-h]

optional arguments:
  -h, --help  show this help message and exit

  2)使用自定义参数:

import argparse


def test():
    # prog测试
    parser = argparse.ArgumentParser(prog="Prog测试")
    parser.print_help()


if __name__ == '__main__':
    test()

  输出如下:

usage: Prog测试 [-h]

optional arguments:
  -h, --help  show this help message and exit

2.2 usage

  默认情况下将自动生成,个人感觉这个很方面;自定义则如下:

import argparse


def test():
    # usage测试
    # %(prog)s用于包含prog的内容
    parser = argparse.ArgumentParser(usage="%(prog)s [options]")
    parser.print_help()


if __name__ == '__main__':
    test()

  输出如下:

usage: test.py [options]

optional arguments:
  -h, --help  show this help message and exit

2.3 description和epilog

  添加描述:

import argparse


def test():
    # description测试
    parser = argparse.ArgumentParser(description="这个是description的测试", epilog="俺也一样")
    parser.print_help()


if __name__ == '__main__':
    test()

  输出如下:

usage: test.py [-h]

这个是description的测试

optional arguments:
  -h, --help  show this help message and exit

俺也一样

2.4 parents

  有点像继承的感觉:当两个parser共用一组参数时,可以无需重复定义:

import argparse


def test():
    # parents测试
    # 需要设置add_help为False,否则会出现冲突
    parser_parents = argparse.ArgumentParser(add_help=False)
    parser_parents.add_argument("parents")

    parser_son = argparse.ArgumentParser(parents=[parser_parents])
    parser_son.add_argument("son")
    parser_son.print_help()

    parser_daughter = argparse.ArgumentParser(parents=[parser_parents])
    parser_daughter.add_argument("daughter")
    parser_daughter.print_help()


if __name__ == '__main__':
    test()

  输出如下:

usage: test.py [-h] parents son

positional arguments:
  parents
  son

optional arguments:
  -h, --help  show this help message and exit
usage: test.py [-h] parents daughter

positional arguments:
  parents
  daughter

optional arguments:
  -h, --help  show this help message and exit

  需要注意的是,如传递了之后,如果父母改变,儿女这边是不受影响的。

2.5 formatter_class

  用于改变输出格式的类,有以下四个:
  1)RawDescriptionHelpFormatter;
  2)RawTextHelpFormatter;
  3)ArgumentDefaultsHelpFormatter;
  4)MetavarTypeHelpFormatter。
  其中前两种的控制选项更多。

2.5.1 RawDescriptionHelpFormatter

  首先看看原版的:

import argparse


def test():
    # formatter_class测试
    parser = argparse.ArgumentParser(
        description="""
        今天天气好鸭
        我要吃个饱啊
        """,
        add_help=False
    )
    parser.print_help()


if __name__ == '__main__':
    test()

  可以发现换行是莫得用的:

usage: test.py

今天天气好鸭 我要吃个饱啊

  再来看看我们的主角:

import argparse


def test():
    # formatter_class测试
    parser = argparse.ArgumentParser(
        formatter_class=argparse.RawDescriptionHelpFormatter,
        description="""
        今天天气好鸭
        我要吃个饱啊
我怎么顶格了?
        """,
        add_help=False
    )
    parser.print_help()


if __name__ == '__main__':
    test()

  和你的输入高度一致:

usage: test.py

        今天天气好鸭
        我要吃个饱啊
我怎么顶格了?

2.5.2 RawTextHelpFormatter

  感觉和RawDescriptionHelpFormatter差不多:

import argparse


def test():
    # formatter_class测试
    parser = argparse.ArgumentParser(
        formatter_class=argparse.RawTextHelpFormatter,
        description="""
        今天天气好啊
        我要吃个饱啊
        
我怎么顶格了?
        """,
        add_help=False
    )
    parser.print_help()


if __name__ == '__main__':
    test()

  输出如下:

usage: test.py

        今天天气好啊
        我要吃个饱啊
        
我怎么顶格了?

2.5.3 ArgumentDefaultsHelpFormatter

  当可选参数的传入有help选项时,可以输出默认值:

import argparse


def test():
    # formatter_class测试
    parser = argparse.ArgumentParser(
        formatter_class=argparse.ArgumentDefaultsHelpFormatter,
    )
    parser.add_argument("--int", type=int, default=1, help="整数")
    parser.print_help()


if __name__ == '__main__':
    test()

  输出如下:

usage: test.py [-h] [-int INT]

optional arguments:
  -h, --help  show this help message and exit
  -int INT    整数 (default: 1)

2.5.4 MetavarTypeHelpFormatter

  使用类型名来表示当前参数:

import argparse


def test():
    # formatter_class测试
    parser = argparse.ArgumentParser(
        formatter_class=argparse.MetavarTypeHelpFormatter,
    )
    parser.add_argument("--int", type=int)
    parser.add_argument("float", type=float)
    parser.print_help()


if __name__ == '__main__':
    test()

  输出如下:

usage: test.py [-h] [--int int] float

positional arguments:
  float

optional arguments:
  -h, --help  show this help message and exit
  --int int

2.6 prefix_chars

  默认前缀是’-’,parser也支持自定义前缀:

import argparse


def test():
    # prefix_chars测试
    parser = argparse.ArgumentParser(
        prefix_chars="-+"
    )
    parser.add_argument("--a")
    parser.add_argument("++b")
    # 同时完成赋值操作
    print(parser.parse_args("--a X ++b Y".split()))


if __name__ == '__main__':
    test()

  输出如下:

Namespace(a='X', b='Y')

2.7 fromfile_prefix_chars

  把参数存入文件,并将指定前缀,即遇到指定前缀的参数认为是文件中的:

import argparse


def test():
    # fromfile_prefix_chars测试
    parser = argparse.ArgumentParser(
        fromfile_prefix_chars='@'
    )

    # 先造一个文件
    with open("args.ini", "w") as fp:
        fp.write("c\nd")

    parser.add_argument("a")
    parser.add_argument("b")
    args = parser.parse_args(["@args.ini"])
    print(args)


if __name__ == '__main__':
    test()

  输出如下:

Namespace(a='c', b='d')

2.8 argument_default

  用于为参数指定一个解析器容忍范围内的初始值:

import argparse


def test():
    # argument_default测试
    parser = argparse.ArgumentParser(
        argument_default=argparse.SUPPRESS
    )

    parser.add_argument("--a")
    # nargs='?'表示赋默认值
    parser.add_argument("b", nargs="?")
    args = parser.parse_args()
    print(args)


if __name__ == '__main__':
    test()

  输出如下:

Namespace()

  而如果没有argument_default=argparse.SUPPRESS,则会输出:

Namespace(a=None, b=None)

2.9 allow_abbrev

  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  

参考

  Python argparse文档