argparse
argparse – Parser for command-line options, arguments and sub-commands
argparse – 就是python用于解析命令行选项,参数和子命令的一个子模块。
Python 也有第三方的库可用于命令行解析,而且功能也更加强大,比如 docopt,Click。不过这些我也没有用过呢。
学习这个子模块的目的就是为了使用命令行改变参数,一次可以执行不同参数的多个程序,调参就会很方便。
3. argparse-命令行选项与参数解析
argparse模块作为optparse的一个替代被添加到Python2.7。argparse的实现支持一些不易于添加到optparse以及要求向后不兼容API变化的特性,因此以一个新模块添加到标准库。
argparse可以提供支持位置参数、子命令、必须选项、”/f”和”+rgb”等选项语法、零个或多个或者一个或多个的参数选项等其他更加丰富灵活的用法。
与optparse相比较
Why use argparse rather than optparse?
argparse的API类似于optparse,甚至在很多情况下通过更新所使用的类名和方法名,使用argparse作为一个简单的替代。然而,有些地方在添加新特性时不能保持直接兼容性。
设置一个解析器
使用argparse的第一步就是创建一个解析器对象,并告诉它将会有些什么参数。那么当你的程序运行时,该解析器就可以用于处理命令行参数。
解析器类是 ArgumentParser
。构造方法接收几个参数来设置用于程序帮助文本的描述信息以及其他全局的行为或设置。
import argparse
parse = argparse.ArgumentParser(description='This is a python sample program')
定义参数
argparse是一个全面的参数处理库。参数可以触发不同的动作,动作由 add_argument()
方法的 action 参数指定。 支持的动作包括保存参数(逐个地,或者作为列表的一部分),当解析到某参数时保存一个常量值(包括对布尔开关真/假值的特殊处理),统计某个参数出现的次数,以及调用一个回调函数。
默认的动作是保存参数值。在这种情况下,如果提供一个类型,那么在存储之前会先把该参数值转换成该类型。如果提供 dest 参数,参数值就保存为命令行参数解析时返回的命名空间对象中名为该 dest 参数值的一个属性。
举个例子:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("echo")
args = parser.parse_args()
print(args.echo)
运行代码:
C:\Users\habits\Anaconda3\python.exe C:/Users/habits/Documents/PycharmProjects/test/python/m_argparse.py
usage: m_argparse.py [-h] echo
m_argparse.py: error: the following arguments are required: echo
带参数的话:
C:\Users\habits\Anaconda3\python.exe C:/Users/habits/Documents/PycharmProjects/test/python/m_argparse.py -h
usage: m_argparse.py [-h] echo
positional arguments:
echo
optional arguments:
-h, --help show this help message and exit
C:\Users\habits\Anaconda3\python.exe C:/Users/habits/Documents/PycharmProjects/test/python/m_argparse.py foo
foo
说明:
- 上述代码中使用add_argument()方法指定一个程序接收的命令行选项;
- 这时在命令行中调用test.py,后必须指定一个选项参数;
- parse_args()方法则返回命令行中为选项指定的数据;
- 位置选项也成为返回数据的属性名,通过属性名可以获取数据; 上述帮助命令,返回信息可以知道echo是一个未知参数,但是其具体如何使用无法得知,为了使其更加丰富易懂,可以在add_argument()内添加其他的属性。
解析一个命令行
定义了所有参数之后,你就可以给 parse_args()
传递一组参数字符串来解析命令行。默认情况下,参数是从 sys.argv[1:]
中获取,但你也可以传递自己的参数列表。选项是使用GNU/POSIX语法来处理的,所以在序列中选项和参数值可以混合。
parse_args() 的返回值是一个命名空间,包含传递给命令的参数。该对象将参数保存其属性,因此如果你的参数 dest
是"myoption"
,那么你就可以args.myoption
来访问该值。
简单示例
以下简单示例带有3个不同的选项:一个布尔选项(-a),一个简单的字符串选项(-b),以及一个整数选项(-c)。
import argparse
parser = argparse.ArgumentParser(description='Short sample app')
parser.add_argument('-a', action="store_true", default=False)
parser.add_argument('-b', action="store", dest="b")
parser.add_argument('-c', action="store", dest="c", type=int)
print parser.parse_args(['-a', '-bval', '-c', '3'])