python argparse ArgumentParser使用方法

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

示例

以下代码是一个 Python 程序,它获取一个整数列表并计算总和或者最大值:

import argparse

parser = argparse.ArgumentParser(description='Process some integers.')
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)')

args = parser.parse_args()
print(args.accumulate(args.integers))

假设上面的 Python 代码保存在名为 prog.py 的文件中,它可以在命令行运行并提供有用的帮助消息:

$ python prog.py -h
usage: prog.py [-h] [--sum] N [N ...]

Process some integers.

positional arguments:
 N           an integer for the accumulator

optional arguments:
 -h, --help  show this help message and exit
 --sum       sum the integers (default: find the max)

当使用适当的参数运行时,它会输出命令行传入整数的总和或者最大值:

$ python prog.py 1 2 3 4
4

$ python prog.py 1 2 3 4 --sum
10

如果传入无效参数,则会报出错误:

$ python prog.py a b c
usage: prog.py [-h] [--sum] N [N ...]
prog.py: error: argument N: invalid int value: 'a'

以下部分将引导你完成这个示例。

创建一个解析器

使用 argparse 的第一步是创建一个 ArgumentParser 对象:

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

ArgumentParser 对象包含将命令行解析成 Python 数据类型所需的全部信息。

添加参数

给一个 ArgumentParser 添加程序参数信息是通过调用 add_argument()方法完成的。通常,这些调用指定 ArgumentParser如何获取命令行字符串并将其转换为对象。这些信息在 parse_args()调用时被存储和使用。例如:

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() 函数。

解析参数

ArgumentParser 通过 parse_args() 方法解析参数。它将检查命令行,把每个参数转换为适当的类型然后调用相应的操作。在大多数情况下,这意味着一个简单的 Namespace 对象将从命令行参数中解析出的属性构建:

parser.parse_args(['--sum', '7', '-1', '42'])
Namespace(accumulate=<built-in function sum>, integers=[7, -1, 42])

在脚本中,通常 parse_args() 会被不带参数调用,而 ArgumentParser 将自动从 sys.argv 中确定命令行参数。

一般我们常用的如下:
添加位置参数(即跟在python main.py后指定位置处参数)

# main.py
import argparse
if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument('number', type=int)
    # 实际上是调用int()将输入的字符串转化了
    parser.add_argument('string', type=str)
    namespace = parser.parse_args()
    # 注意输入的先后顺序要固定了
    print(namespace.number, namespace.string)
>>> python main.py 7 test
>>> 7 test
>>>
>>> python main.py test 7
>>> usage: main.py [-h] number string
>>> main.py: error: argument number: invalid int value: 'test'

添加可选参数以及记录参数是否出现过

# main.py
import argparse
if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument('--number', type=int)
    parser.add_argument('--string', type=str)
    parser.add_argument('--appeared', action='store_true')
    namespace = parser.parse_args()
    print(namespace.number, namespace.string, namespace.appeared)
>>> python main.py --number=7 --string=test --appeared
>>> 7 test True
>>>
>>> python main.py --number 7 --string test
>>> 7 test False

添加默认参数值

# main.py
import argparse
if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument('--number', type=int, default=1)
    namespace = parser.parse_args()
    print(namespace.number)
>>> python main.py --number=7
>>> 7
>>>
>>> python main.py
>>> 1

添加多个参数

# main.py
import argparse
if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument('--numbers', type=int, default=[1, 1, 1], nargs=3)
    # 相当于往后读了3个参数,并把这些参数都经过int()处理,最终送到list中
    namespace = parser.parse_args()
    print(namespace.numbers)
>>> python main.py --numbers 2 3 4
>>> [2, 3, 4]
>>>
>>> python main.py --numbers=2 3 4
>>> usage: main.py [-h] [--numbers NUMBERS NUMBERS NUMBERS]
>>> main.py: error: argument --numbers: expected 3 arguments
>>>
>>> python main.py
>>> [1, 1, 1]

如果想了解更多用法,可以参考我列出的文献地址。

参考文献

  • https://docs.python.org/zh-cn/3/library/argparse.html
  • https://blog.csdn.net/qq_34193444/article/details/109774547

Guess you like

Origin blog.csdn.net/weixin_35770067/article/details/119576333