python argparse—用于命令行选项、参数和子命令的解析器
参考:https://docs.python.org/3/library/argparse.html
argparse.ArgumentParser: 创建Parser对象
语法格式
class argparse.ArgumentParser(prog=None, usage=None, description=None, epilog=None, parents=[], formatter_class=argparse.HelpFormatter, prefix_chars='-', fromfile_prefix_chars=None, argument_default=None, conflict_handler='error', add_help=True, allow_abbrev=True, exit_on_error=True)
参数解释
- prog: 项目名称。default:
os.path.basename(sys.argv[0])
- usage: 描述项目用途的字符串。(默认:从添加到解析器的参数生成)
- decription: 在参数help之前显示的文本(默认情况下,没有文本)
- epilog: 在参数help之后显示的文本(默认情况下,没有文本)
- prefix_chars: 可选参数前缀的字符集(默认值:' - ')
- parents: ArgumentParser对象的列表,其参数也应该包含在内,可以理解为将多个argument预先设置好放到一个列表中,然后通过parents参数来调用。
- formatter_class: 指定帮助文档的格式,目前,有四种:class argparse.RawDescriptionHelpFormatter; class argparse.RawTextHelpFormatter; class argparse.ArgumentDefaultsHelpFormatter; class argparse.MetavarTypeHelpFormatter
更新
- 在3.5版更改:添加了allow_abbrev参数。
- 在3.9版更改:添加了exit_on_error参数。
代码示例
from argparse import ArgumentParser
from textwrap import dedent
fields = dedent(
"""
output:
<folder>
folder containing fasta.
lineages
successfully processed records.
""")
parent_parser = ArgumentParser(add_help=False)
"""
Note that most parent parsers will specify add_help=False.
Otherwise, the ArgumentParser will see two -h/--help options (one in the parent and one in the child) and raise an error.
"""
parser = ArgumentParser(prog='myprogram',parents=[parent_parser], epilog=fields)
parser.add_argument('--output', help='fasta file of the %(prog)s program') # 通过%(prog)s可以访问program name
parser.print_help()
输出结果:
usage: myprogram [-h] [--output OUTPUT]
optional arguments:
-h, --help show this help message and exit
--output OUTPUT fasta file of the myprogram program
output: <folder> folder containing fasta. lineages successfully processed records.
ArgumentParser.add_argument: 添加参数,定义命令行参数如何解析
语法格式
ArgumentParser.add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])
常用参数解释:
- name or flags: 选项字符串的名字或列表,一次只能添加一个参数
- action: 指定如何处理命令行参数。接受
'store'
(默认操作)、'store_const'
、'store_true'
和'store_false'
、'append'
、"append_const"
、"count"
、"version"
、"extend"
- nargs: 参数可以被使用的次数。
N
:一个整数,命令行中接收N个参数将并被收集到一个列表中;'?'
:从命令行中选择参数的具体值;'*'
:所有存在的命令行参数被收集到一个列表中; or'+'
:与"*"类似,此外,如果没有至少一个命令行参数,将生成一条错误消息 - type: 自动将参数转换为给定类型。int, float, argparse.FileType('w'),或可调用函数
- dest: 添加到parse_args()返回对象的属性名称。一般不用专门设置
- choices: 从一组受限制的值中选择参数值。
代码示例
<name or flags>
"""位置参数和可选参数(name or flags)"""
>>> from argparse import ArgumentParser
>>> parser = ArgumentParser(prog='myprogram')
>>> parser.print_help()
usage: myprogram [-h]
optional arguments:
-h, --help show this help message and exit
>>> parser.add_argument("-o","--out", help="the result file") #- or -- prefix被parse_args()解析为可选参数
>>> parser.add_argument("i",help="the input file") #位置参数
>>> parser.print_help()
usage: myprogram [-h] [-o OUT] i
positional arguments:
i the input file
optional arguments:
-h, --help show this help message and exit
-o OUT, --out OUT the result file
>>> parser.parse_args(["a.txt"])
Namespace(out=None, i='a.txt')
>>> parser.parse_args(["a.txt","-o","outfile.fasta"])
Namespace(out='outfile.fasta', i='a.txt')
>>> parser.parse_args(["-o","outfile.fasta"])
usage: myprogram [-h] [-o OUT] i
myprogram: error: the following arguments are required: i
<action>
"""action"""
>>> from argparse import ArgumentParser
>>> parser = ArgumentParser(prog='myprogram')
>>> parser.add_argument("-a",action="store") #action="store"存储参数的值,默认操作
>>> parser.parse_args(["-a","alter"])
Namespace(a='alter')
>>> parser.add_argument("-i",help="the input file",action="store_const", const="inputfile.fasta") #'store_const'存储const参数指定的值,通常用于指定可选参数的值
>>> parser.parse_args(["-i"])
Namespace(a=None, i='inputfile.fasta')
>>> parser.add_argument("-s", action="store_true") #'store_true'是'store_const'的特殊情况,用于存储值true
>>> parser.add_argument("-o",action="store_false") #"store_false"是'store_const'的特殊情况,用于存储值false
>>> parser.parse_args("-s -o".split())
Namespace(a=None, i=None, s=True, o=False)
>>> parser.parse_args(["-a","alter"])
Namespace(a='alter', i=None, s=False, o=True)
>>> parser.add_argument("-y", action="append") #"append"存储一个列表,并将每个参数值附加到列表中。对于多次指定一个选项很有用
>>> parser.parse_args("-y 1 -y 2".split()) #等价于parser.parse_args(["-y","1", "-y", "2"])
Namespace(a=None, i=None, s=False, o=True, y=['1', '2'])
>>> parser.add_argument("-t",action="append_const",dest="types",const=str) #"append_const"存储一个列表,并将const关键字参数指定的值附加到列表中
>>> parser.parse_args(["-t"])
Namespace(a=None, i=None, s=False, o=True, y=None, types=[<class 'str'>])
>>> parser.add_argument("-v", action="count") # "count"计算关键字参数出现的次数
>>> parser.parse_args(["-vvv"])
Namespace(a=None, i=None, s=False, o=True, y=None, types=None, v=3)
>>> parser.add_argument("--version", action="version", version="%(prog)s 2.0") #使用version=关键字参数,并在调用时打印版本信息并退出
>>> parser.parse_args(["--version"])
myprogram 2.0
>>> parser.add_argument("-p", action="extend", nargs="+",type=str) #"extend"存储一个列表,并将每个参数值扩展到该列表
>>> parser.parse_args(["-p","b1","-p","b2","b3"])
Namespace(a=None, i=None, s=False, o=True, y=None, types=None, v=None, p=['b1', 'b2', 'b3'])
<choices>
>>> from argparse import ArgumentParser
>>> parser = ArgumentParser(prog='myprogram')
>>> parser.add_argument("--type", choices=["int","float","factor"])
_StoreAction(option_strings=['--type'], dest='type', nargs=None, const=None, default=None, type=None, choices=['int', 'float', 'factor'], required=False, help=None, metavar=None)
>>> parser.parse_args(["--type","float"])
Namespace(type='float')
ArgumentParser.add_argument_group: 自定义合适的参数组
默认情况下,ArgumentParser在显示帮助消息时将命令行参数分组为“位置参数”和“选项”。
语法格式
ArgumentParser.add_argument_group(title=None, description=None)
代码示例
from argparse import ArgumentParser
parser = ArgumentParser(prog='myprogram')
group1 = parser.add_argument_group("group1")
group1.add_argument("-i",help="input file")
group2 = parser.add_argument_group("group2")
group2.add_argument('--output', help='fasta file of the %(prog)s program') # 通过%(prog)s可以访问program name
parser.print_help()
输出结果:
usage: myprogram [-h] [-i I] [--output OUTPUT]
optional arguments:
-h, --help show this help message and exit
group1:
-i I input file
group2:
--output OUTPUT fasta file of the myprogram program
ArgumentParser.add_subparsers: 创建子命令
add_subparsers()
方法通常不带参数调用,并返回一个特殊的操作对象。该对象有一个方法 add_parser()
,它接受一个命令名称和任何ArgumentParser
构造函数参数,并返回一个可以照常修改的ArgumentParser
对象。
语法格式
ArgumentParser.add_subparsers([title][, description][, prog][, parser_class][, action][, option_strings][, dest][, required][, help][, metavar])
常用参数解释:
- title: 帮助输出中sub-parser 组的标题;
- description: 帮助输出中sub-parser 组的说明;
- dest: 存储 sub-command 名称的属性名称;
- metavar: 在帮助中显示可用的字符串 sub-commands
- required: 是否提供子命令,默认情况下为False
代码示例
>>> from argparse import ArgumentParser
>>> parser = ArgumentParser(prog='myprogram')
>>> parser.add_argument('--foo', action='store_true', help='foo help')
>>> subparsers = parser.add_subparsers(help='sub-command help')
>>> parser_a = subparsers.add_parser('a', help='a help')
>>> parser_b = subparsers.add_parser('b', help='b help')
>>> parser_a.add_argument('bar', type=int, help='bar help')
>>> parser_b.add_argument('--baz', choices='XYZ', help='baz help')
>>> parser.parse_args(['a', '12'])
Namespace(foo=False, bar=12)
>>> parser.parse_args(['--foo', 'b', '--baz', 'Z'])
Namespace(foo=True, baz='Z')
注:parser.parse_args()
返回的对象将仅包含由命令行选择的主解析器和子解析器的属性(而不包含任何其他子解析器)。
类似地,当从子解析器请求帮助消息时,只会打印该特定解析器的帮助。帮助消息将不包括父解析器或兄弟解析器消息。
>>> parser.print_help()
usage: myprogram [-h] [--foo] {a,b} ...
positional arguments:
{a,b} sub-command help
a a help
a a help
b b help
optional arguments:
-h, --help show this help message and exit
--foo foo help
>>> parser.parse_args(['a', '--help'])
usage: myprogram a [-h] bar
positional arguments:
bar bar help
optional arguments:
-h, --help show this help message and exit
ArgumentParser.parse_args: 解析参数,将参数字符串转换为对象,并将其分配为名称空间的属性
语法格式
ArgumentParser.parse_args(args=None, namespace=None)
代码示例
>>> from argparse import ArgumentParser
>>> parser = ArgumentParser(prog='myprogram')
>>> parser.add_argument("--clones")
>>> parser.add_argument("-i")
>>> parser.add_argument("-s", action="store_true")
>>> parser.add_argument("-o",action="store_false")
>>> parser.parse_args(["-i","inputfile"]) #等价于parser.parse_args(["-iinputfile"])
Namespace(clones=None, i='inputfile', s=False, o=True)
>>> parser.parse_args(["--clones","1"]) #等价于parser.parse_args(["--clones=1"])
Namespace(clones='1', i=None, s=False, o=True)
>>> parser.parse_args(["-soiinputfile"]) #几个短选项可以连接在一起,只需使用一个前缀,只要只有最后一个选项(或其中没有一个)需要值
Namespace(clones=None, i='inputfile', s=True, o=False)
ArgumentParser.set_defaults(**kwargs): 添加默认属性
在大多数时候,parse_args()所返回对象的属性将完全通过检查命令行参数和参数动作来确定。set_defaults()
则允许加入一些无须任何命令行检查的额外属性。
>>> from argparse import ArgumentParser
>>> parser = ArgumentParser(prog='myprogram')
>>> parser.add_argument("-i")
>>> parser.set_defaults(b="inputfile")
>>> parser.parse_args([])
Namespace(i=None, b='inputfile')