python argparse—用于命令行选项、参数和子命令的解析器

参考:https://docs.python.org/3/library/argparse.html

argparse.ArgumentParser: 创建Parser对象

语法格式

class argparse.ArgumentParser(prog=Noneusage=Nonedescription=Noneepilog=Noneparents=[]formatter_class=argparse.HelpFormatterprefix_chars='-'fromfile_prefix_chars=Noneargument_default=Noneconflict_handler='error'add_help=Trueallow_abbrev=Trueexit_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=Nonedescription=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=Nonenamespace=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')

 

posted @ 2023-07-30 17:23  yayagogogo  阅读(209)  评论(0编辑  收藏  举报