先从例子说起,编写文件:basic002_args.py
# -*- coding: utf-8 -*- import argparse parser = argparse.ArgumentParser() parser.parse_args()
命令行依次执行:
python basic002_args.py python basic002_args.py --help python basic002_args.py -v python basic002_args.py foo
注意观察结果。
设置一个解析器
使用argparse的第一步就是创建一个解析器对象,并告诉它将会有些什么参数。那么当你的程序运行时,该解析器就可以用于处理命令行参数。
解析器类是 ArgumentParser 。构造方法接收几个参数来设置用于程序帮助文本的描述信息以及其他全局的行为或设置。
import argparse
parser = argparse.ArgumentParser(description='This is a PyMOTW sample program')
定义参数
argparse是一个全面的参数处理库。参数可以触发不同的动作,动作由 add_argument() 方法的 action 参数指定。
支持的动作包括保存参数(逐个地,或者作为列表的一部分),当解析到某参数时保存一个常量值(包括对布尔开关真/假值的特殊处理),统计某个参数出现的次数,以及调用一个回调函数。
默认的动作是保存参数值。在这种情况下,如果提供一个类型,那么在存储之前会先把该参数值转换成该类型。如果提供 dest参数,参数值就保存为命令行参数解析时返回的命名空间对象中名为该 dest 参数值的一个属性。
解析一个命令行
定义了所有参数之后,你就可以给 parse_args() 传递一组参数字符串来解析命令行。默认情况下,参数是从 sys.argv[1:] 中获取,但你也可以传递自己的参数列表。选项是使用GNU/POSIX语法来处理的,所以在序列中选项和参数值可以混合。
parse_args() 的返回值是一个命名空间,包含传递给命令的参数。该对象将参数保存其属性,因此如果你的参数 dest 是 "myoption",那么你就可以args.myoption 来访问该值。
其中任意一个参数若没有在命令行中提供,或给定的值不能被转换为正确的类型,就会报告一个错误。
参数动作
argparse内置6种动作可以在解析到一个参数时进行触发:
store 保存参数值,可能会先将参数值转换成另一个数据类型。若没有显式指定动作,则默认为该动作。
store_const 保存一个被定义为参数规格一部分的值,而不是一个来自参数解析而来的值。这通常用于实现非布尔值的命令行标记。
store_ture/store_false 保存相应的布尔值。这两个动作被用于实现布尔开关。
append 将值保存到一个列表中。若参数重复出现,则保存多个值。
append_const 将一个定义在参数规格中的值保存到一个列表中。
version 打印关于程序的版本信息,然后退出
# -*- coding: utf-8 -*- import argparse parser = argparse.ArgumentParser(description='This is a PyMOTW sample program') parser.parse_args() 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']))
输出:Namespace(a=True, b='val', c=3)
在输出中与'c'关联的值是一个整数,因为程序告诉ArgumentParser在保存之前先转换该参数。
“长”选项名字,即选项的名字多于一个字符,以相同的方式进行处理。
import argparse parser = argparse.ArgumentParser(description='This is a PyMOTW sample program') parser.parse_args() 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'])) parser.add_argument('--noarg', action="store_true", default=False) parser.add_argument('--witharg', action="store", dest="witharg") parser.add_argument('--witharg2', action="store", dest="witharg2", type=int) print(parser.parse_args(['--noarg', '--witharg', 'val', '--witharg2=3']))
输出结果:
Namespace(a=True, b='val', c=3)
Namespace(a=False, b=None, c=None, noarg=True, witharg='val', witharg2=3)