基本流程
# argparse_example.py
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)
# example with long option names
parser.add_argument('--noarg', action="store_true", default=False)
# parse_args的返回值是一个包含命令参数的Namespace
print(type(parser.parse_args()))
print(parser.parse_args(['-a', "-bval", '-c', '3']))
打开终端到当前py文件目录
> python argparse_short.py
<class 'argparse.Namespace'>
Namespace(a=True, b='val', c=3)
参数动作(action)
遇到一个参数时会触发6个内置动作:
store:保存值,可能首先要将值转换成一个不同的类型(可选)。如果没有显式指定动作,这将是默认动作。
store_const:保存参数规范中定义的一个值,而不是来自解析参数的一个值,这通常用于实现非bool值的命令行标志。
store_true/store_false:保存适当的bool值,这些动作用于实现Boolean语句。
append:将值保存到一个列表,如果参数值重复则会保存多个值。
append_const:将参数规范中定义的一个值保存到一个列表
version:打印程序的版本详细信息,然后退出。
# argparse_action.py
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-s', action="store",
dest="simple_value",
help="Store a sample value")
parser.add_argument('-c', action='store_const',
dest='constant_value',
const='value-to-store',
help="Store a constant value")
parser.add_argument('-t', action='store_true',
default=False,
dest='boolean_t',
help="Set a switch to true")
parser.add_argument('-f', action='store_false',
default=True,
dest='boolean_f',
help="Set a switch to false")
parser.add_argument('-a', action='append',
dest='collection',
default=[],
help="Add repeated values to a list")
parser.add_argument('-A', action='append_const',
dest='const_collection',
const='value-1-to append',
default=[],
help="Add different values to list")
parser.add_argument('-B', action='append_const',
dest='const_collection',
const='value-2-to-append',
help='Add different values to list')
parser.add_argument('--version', action='version',
version='%(prog)s 1.0')
#访问设置的dest变量的方法
results = parser.parse_args() #1
print('simple_value ={!r}'.format(results.simple_value)) #2
print('constant_value ={!r}'.format(results.constant_value))
print('boolean_t ={!r}'.format(results.boolean_t))
print('boolean_f ={!r}'.format(results.boolean_f))
print('collection ={!r}'.format(results.collection))
print('const_collection ={!r}'.format(results.const_collection))
- 运行示例
> python argparse_action.py -h
usage: argparse_action.py [-h] [-s SIMPLE_VALUE] [-c] [-t] [-f]
[-a COLLECTION] [-A] [-B] [--version]optional arguments:
-h, --help show this help message and exit
-s SIMPLE_VALUE Store a sample value
-c Store a constant value
-t Set a switch to true
-f Set a switch to false
-a COLLECTION Add repeated values to a list
-A Add different values to list
-B Add different values to list
--version show program's version number and exit
> python argparse_action.py -s value
simple_value ='value'
constant_value =None
boolean_t =False
boolean_f =True
collection =[]
const_collection =[]
> python argparse_action.py -c
simple_value =None
constant_value ='value-to-store'
boolean_t =False
boolean_f =True
collection =[]
const_collection =[]
> python argparse_action.py -t
simple_value =None
constant_value =None
boolean_t =True
boolean_f =True
collection =[]
const_collection =[]
> python argparse_action.py -f
simple_value =None
constant_value =None
boolean_t =False
boolean_f =False
collection =[]
const_collection =[]
> python argparse_action.py -a one -a two -a three
simple_value =None
constant_value =None
boolean_t =False
boolean_f =True
collection =['one', 'two', 'three']
const_collection =[]
> python argparse_action.py -B -A -B
simple_value =None
constant_value =None
boolean_t =False
boolean_f =True
collection =[]
const_collection =['value-2-to-append', 'value-1-to append', 'value-2-to-append']
读取来自文件的参数
# argparse_fromfile_prefix_chars.txt
-a
-b
2
# argparse_fromfile_prefix_chars.py
import argparse
# 在发现一个有@前缀的参数时会停止,然后读取指定文件来查找更多参数
parser = argparse.ArgumentParser(
description="Short sample app",
fromfile_prefix_chars='@'
)
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(['@argparse_fromfile_prefix_chars.txt']))
print(parser.parse_args())
> python argparse_fromfile_prefix_chars.py @argparse_fromfile_prefix_chars.txt
Namespace(a=True, b='2', c=None)
帮助输出
默认状况下使用-h或--help参数可获得相关帮助信息
-
也可在定义解析器时关闭
parser = argparse.ArgumentParser(add_help=False)
定制的帮助显示方式可查阅相关文档
高级参数处理
- 可变参数表
值 | 含义 |
---|---|
N | 参数的绝对个数 |
? | 0或1个参数 |
* | 0或所有参数 |
+ | 所有(至少1个)参数 |
示例代码
# argparse_nargs.py
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--three', nargs=3)
parser.add_argument('--optional', nargs='?')
parser.add_argument('--all', nargs='*', dest='all')
parser.add_argument('--one-or-more', nargs='+')
print(parser.parse_args())
运行示例
> python argparse_nargs.py --three a b c
Namespace(all=None, one_or_more=None, optional=None, three=['a', 'b', 'c'])
> python argparse_nargs.py --optional with_value
Namespace(all=None, one_or_more=None, optional='with_value', three=None)
> python argparse_nargs.py --all with multiple values
Namespace(all=['with', 'multiple', 'values'], one_or_more=None, optional=None, three=None)
python argparse_nargs.py --one-or-more
usage: argparse_nargs.py [-h] [--three THREE THREE THREE]
[--optional [OPTIONAL]] [--all [ALL [ALL ...]]]
[--one-or-more ONE_OR_MORE [ONE_OR_MORE ...]]
- 参数类型:argparse将所有参数值都定义为字符串,除非明确要求将字符串转换为另一个类型。add_argument()的type参数定义了一个转换器函数(见前面的示例代码)。如果类型转换失败,会产生一个异常。
其它解析方法示例
from sys import argv
script, first, second, third = argv
# argv is a list
print(type(argv))
print(f"The script is called {script}")
print(f"Your first variable is: {first}")
print(f"Your second variable is: {second}")
print(f"Your third variable is: {third}")
> python sys_argv.py 123 456 789
<class 'list'>
The script is called sys_argv.py
Your first variable is: 123
Your second variable is: 456
Your third variable is: 789
注:内容主要来源于《Python3标准库》(Doug Hellmann著),挑选了笔者认为常用的部分