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

发布时间 2023-07-30 17:27:39作者: yayagogogo

参考: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.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)