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