【Python】argparse模块

  • 一、简介
  • 二、基本使用
  • 三、参数类型
  • 四、高级特性
  • 五、基本语法
  • 5.1 ArgumentParser的参数
  • 5.2 ArgumentParser的方法
  • 5.3 `parser.add_argument()`方法
  • 六、使用例子
  • 6.1 例子1: 基本用法
  • 6.2 例子2:运行FastAPI
  • 七、相关链接
  • 一、简介

    argparse模块是Python标准库的一部分,旨在简化命令行接口的创建过程。
    它允许开发者定义程序接受哪些命令行参数,并自动解析这些参数,同时提供帮助信息和错误处理。
    以下是关于argparse模块更深入的理解,包括其基本用法、特性以及一些高级功能。

    二、基本使用

  • 要开始使用argparse,首先需要导入模块并创建一个ArgumentParser对象。
    这个对象用于配置如何解析命令行参数。
    例如:
  • import argparse
    
    parser = argparse.ArgumentParser(description='Calculate the square of a number.')
    
  • 接下来,可以通过调用add_argument()方法来指定希望解析的参数。
    对于每个参数,你可以设置它的名称或标志(flags)、类型、默认值、帮助文本等属性。
  • parser.add_argument('number', type=int, help='The number to be squared.')
    
  • 一旦所有必要的参数都被添加到ArgumentParser实例中,就可以调用parse_args()方法来解析实际传入的命令行参数了。
    这将返回一个包含所有解析后参数的对象,通常是一个Namespace实例。
  • args = parser.parse_args()
    print(f"The square of {args.number} is {args.number ** 2}")
    

    这段代码定义了一个简单的命令行工具,它可以接收一个整数作为位置参数,并计算该数字的平方。

    三、参数类型

    argparse支持多种类型的参数,包括位置参数和可选参数。

  • 位置参数是指那些根据它们在命令行中的位置来确定意义的参数;
  • 而可选参数则是带有前缀(通常是---)的标志,用户可以选择是否提供它们。
    例如:
  • # 定义一个可选参数
    parser.add_argument('--verbose', action='store_true', help='Enable verbose output')
    

    这里定义了一个名为--verbose的布尔型开关参数,如果用户指定了这个选项,则相应的属性会被设置为True
    否则,默认情况下为False

    四、高级特性

    除了上述基本功能外,argparse还提供了许多高级特性来增强命令行界面的功能性和灵活性。
    以下是一些值得注意的功能:

  • 自定义类型转换:可以为参数指定自定义的类型转换器,使得输入可以在存储之前被修改或验证。
  • 动作定义:除了常见的存储操作外,还可以定义其他类型的“动作”,如计数次数、追加到列表中或是执行特定函数。
  • 子命令支持:当构建具有多个子命令的应用程序时(比如Git),可以通过add_subparsers()方法添加子解析器。
  • 帮助格式化:提供了几种不同的帮助消息格式化类,以便更好地控制输出样式7。
  • 五、基本语法

    5.1 ArgumentParser的参数

    ArgumentParser对象是Python标准库argparse模块的核心组件之一,它负责配置命令行解析器的行为。
    创建ArgumentParser实例时可以传递多个参数来定制其行为和输出格式。
    以下是ArgumentParser构造函数中可以使用的参数列表及其说明:

  • description:描述程序用途的字符串,当用户请求帮助信息(如通过-h--help选项)时会显示。
  • parser = argparse.ArgumentParser(description='Process some integers.')
    
  • epilog:帮助信息的最后一部分,通常用于提供额外的信息或示例。这部分内容会在所有参数的帮助信息之后显示。
  • parser = argparse.ArgumentParser(epilog='Example usage: prog.py [options] file1 file2')
    
  • formatter_class:控制帮助信息格式化的类,默认使用的是argparse.HelpFormatter
  • 可以通过指定不同的类来自定义帮助信息的格式,例如argparse.RawDescriptionHelpFormatter可以保持原始描述文本格式不变。
  • parser = argparse.ArgumentParser(formatter_class=argparse.RawDescriptionHelpFormatter)
    
  • argument_default:设置所有参数的默认值。注意,这会影响所有未明确指定默认值的参数,因此应谨慎使用。
  • parser = argparse.ArgumentParser(argument_default=argparse.SUPPRESS)  # 不设置默认值
    
  • conflict_handler:处理冲突选项的方式,默认为'error',即遇到重复选项时报错;
    另一种选择是'resolve',它会尝试解决冲突。
  • parser = argparse.ArgumentParser(conflict_handler='resolve')
    
  • add_help:是否自动添加-h/--help选项,默认为True
    如果设为False,则必须手动添加帮助选项。
  • parser = argparse.ArgumentParser(add_help=False)
    
  • allow_abbrev:允许缩写长选项名称,默认为True
  • Python 3.5开始引入此参数,以增强安全性。
  • parser = argparse.ArgumentParser(allow_abbrev=False)
    

    parents:一个包含其他ArgumentParser对象的列表,这些对象的参数也会被当前解析器继承。
    这对于复用现有的参数配置非常有用。

    parent_parser = argparse.ArgumentParser(add_help=False)
    parent_parser.add_argument('--parent_option', type=int)
    parser = argparse.ArgumentParser(parents=[parent_parser])
    
  • prefix_chars:定义前缀字符集,默认为'-',这意味着选项可以以前缀---开头。
    你可以改变这个集合来支持不同的前缀字符。
  • parser = argparse.ArgumentParser(prefix_chars='-+')
    
  • fromfile_prefix_chars:允许从文件读取更多参数,指定哪些字符表示从文件加载参数。
    例如,如果你设置了fromfile_prefix_chars='@',那么命令行中的@filename将指示解析器从filename文件中读取附加参数。
  • parser = argparse.ArgumentParser(fromfile_prefix_chars='@')
    
  • prog:程序名,用于生成帮助信息中的程序名称部分。
    如果不指定,则默认取自sys.argv[0]
  • parser = argparse.ArgumentParser(prog='my_program')
    
  • usage:自定义用法字符串,覆盖默认生成的帮助信息中的用法部分。
    若未提供,则根据已添加的参数自动生成。
  • parser = argparse.ArgumentParser(usage='%(prog)s [options]')
    
  • exit_on_error:决定在遇到错误时是否退出,默认为True
    如果设为False,则可以在捕获到错误后继续执行代码,而不是立即终止程序。
  • parser = argparse.ArgumentParser(exit_on_error=False)
    

    以上就是ArgumentParser构造函数的主要参数。
    通过合理配置这些参数,你可以构建出既灵活又易于使用的命令行接口。
    每个参数都有助于调整解析器的行为,使其更适合特定的应用场景。
    希望这些信息能够帮助你更好地理解和利用argparse模块的功能。

    5.2 ArgumentParser的方法

    argparse.ArgumentParser 类提供了多种方法来处理命令行参数解析,下面将详细介绍这些方法及其用途。

  • 参数添加方法
  • add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])
    该方法用于向 ArgumentParser 添加命令行参数的信息。你可以通过它指定如何从命令行字符串中提取并转换为对象。
    例如,定义一个可选参数 -f 或者位置参数 filename
  • add_subparsers([title][, description][, prog][, parser_class][, action][, dest][, help][, metavar])
    此方法允许你创建子命令解析器,这对于构建支持多个子命令的应用程序非常有用。
    每个子命令可以有自己的参数集,并且可以通过不同的解析器实例独立管理 。
  • 参数解析与输出方法
  • parse_args(args=None, namespace=None)
    这是最重要的方法之一,用来检查命令行并将每个参数转换成适当的类型,然后调用相应的操作。
    通常情况下,这意味着会构造一个简单的 Namespace 对象,其中包含了从命令行解析出来的属性。
    如果未提供 args 参数,则默认使用 sys.argv[1:]

  • parse_known_args(args=None, namespace=None)
    parse_args() 类似,但它只解析已知的参数,而忽略未知参数。
    这在你需要处理一些不被当前解析器认识但又不想报错的情况下很有用 。

  • print_help(file=None)
    打印帮助信息到标准输出或指定文件中。帮助信息包括程序描述、用法以及所有参数的帮助文本等 8。

  • format_usage() 和 print_usage(file=None)
    format_usage() 返回一个包含用法信息的字符串;
    print_usage() 则直接打印该字符串到标准输出或指定文件。
    它们主要用于展示简短的命令行用法提示。

  • format_help()
    返回完整的帮助信息作为字符串,包括程序描述、用法和所有参数的帮助消息。此方法常用于生成详细的帮助文档。

  • 其他辅助方法
  • error(message)
    当解析过程中遇到错误时调用此方法,它会打印错误信息并退出程序。
    通常情况下,你会看到类似 "usage: PROG [-h] [arguments]" 的格式化用法信息加上具体的错误描述 。
  • exit(status=0, message=None)
    显式地让解析器退出,可以选择性地传递状态码和一条消息给终端用户。
    这对于控制解析器的行为特别有用,比如当检测到无效输入时提前终止执行 12。
  • set_defaults(**kwargs)
    设置命名空间中某些参数的默认值。
    这可以在定义参数之前或之后调用,也可以在子解析器上设置以覆盖父解析器中的默认值。
  • 通过上述方法,ArgumentParser 提供了一套完整的工具链来管理和解析命令行参数,使得开发者能够轻松创建出功能强大且易于使用的命令行接口 。
    此外,argparse 模块还支持自定义动作类(如 Action),以便更灵活地处理特定类型的参数 。

    5.3 parser.add_argument()方法

    parser.add_argument() 是 Python 内置模块 argparse 中的一个方法,用于向命令行参数解析器添加参数定义

    通过调用这个方法,我们可以指定程序期望接收哪些命令行参数,以及这些参数应该如何被解释和处理。
    这使得编写用户友好的命令行接口变得非常简单,并且 argparse 模块还会自动生成帮助信息和使用手册,在用户提供了无效参数时给出错误提示。

    当我们在代码中创建了一个 ArgumentParser 对象后,就可以使用 add_argument() 方法来为该解析器添加各种各样的参数选项。
    每个参数都可以配置多个属性,如

  • 名称或标志(name or flags)、
  • 动作(action)、
  • 需要读取的命令行参数数量(nargs)、
  • 常量值(const)
  • 默认值(default)
  • 类型(type)
  • 可选值集合(choices)
  • 是否必需(required)
  • 帮助信息(help)
  • 元变量(metavar)
  • 目标属性名(dest)
  • 下面是一些关键参数的具体说明:

  • name or flags:这是传递给 add_argument() 的第一个参数,可以是一个字符串或者是多个字符串组成的列表。
    如果是单个字符串,则表示这是一个位置参数;
    如果是以连字符开头的字符串(例如 -f--foo),则表示这是一个可选参数。
    位置参数是没有前缀的参数,它们按照在命令行中的出现顺序被捕获。
    而可选参数则是带有前缀的参数,通常用来开启或关闭某些特性,或者传递额外的信息。

  • action:指定了当此参数出现在命令行时应执行的动作,默认是 ‘store’,即存储参数的值。其他常见的动作包括:

  • store_const:存储由 const 关键字参数指定的值;

  • store_truestore_false:分别用于存储布尔值 True 和 False;

  • append:将遇到的值存储到一个列表中;

  • append_const:将 const 关键字参数指定的值添加到列表中;

  • count:统计关键字参数出现的次数;

  • help:打印所有当前解析器中的选项和参数的帮助信息并退出;

  • version:打印版本信息并退出。

  • type:指定了如何将命令行参数转换为目标类型的函数。
    比如,如果我们希望将输入的字符串转换成整数,就可以设置 - type=int。如果提供的参数不能成功转换为目标类型,那么将会抛出一个错误。

  • default:当命令行中没有提供相应的参数时,应该使用的默认值。
    对于可选参数来说,如果没有提供,则会使用这个默认值。

  • choices:限制参数的有效值只能是从给定集合中选取。
    如果用户提供的参数不在这个集合内,那么将会报告一个错误。

  • required:指示该参数是否必须出现在命令行中。
    注意,只有可选参数可以设置此参数为 True,因为位置参数总是被认为是必需的。

  • help:提供关于参数用途的简短描述,当用户请求帮助时会显示这些信息。

  • metavar:定义了在帮助信息中显示的参数名称,而不是实际使用的名称。这对于简化帮助输出很有用。

  • dest:指定了解析后的结果应该存储在哪一个属性中。如果不指定,那么会根据参数的名字自动确定4。

  • 六、使用例子

    6.1 例子1: 基本用法

  • 在命令行运行
    该程序使用了 argparse 模块来解析命令行参数,并计算给定数字的平方。
  • import argparse
    
    parser = argparse.ArgumentParser(description='Calculate the square of a number.')
    parser.add_argument('number', type=int, help='The number to be squared.')
    args = parser.parse_args()
    
    print(f"The square of {args.number} is {args.number ** 2}")
    

    该程序使用了 argparse 模块来解析命令行参数,并计算给定数字的平方。
    要执行这段代码,你需要将上述代码保存到了一个 .py 文件中,例如命名为 square.py。
    这一步非常重要,因为我们将通过命令行来调用这个脚本并传递参数。

    接下来,在命令行(对于 Windows 用户是 CMD 或 PowerShell;
    对于 macOS 和 Linux 用户是终端)中切换到包含 square.py 文件的目录。
    然后你可以使用如下命令格式来运行它:

    python square.py [number]
    

    这里 [number] 是你想要计算其平方的那个整数。比如,如果你想计算 4 的平方,你应该输入:

    python square.py 4
    

    执行上述命令后,程序会输出:

    The square of 4 is 16
    

    参数说明

  • python:这是用来启动 Python 解释器的命令。
  • square.py:这是你要运行的 Python 脚本的名字。
  • 4:这是一个位置参数,代表你想要求平方的那个整数值。在这个例子中,我们传递了 4 作为参数值。
  • 在jupyter notebook运行
  • import sys
    import argparse
    
    from io import StringIO
    
    # 模拟命令行输入
    test_input = ['prog', '4']  # 假设我们想计算4的平方
    sys.argv = test_input
    
    parser = argparse.ArgumentParser(description='Calculate the square of a number.')
    parser.add_argument('number', type=int, help='The number to be squared.')
    args = parser.parse_args()
    
    print(f"The square of {args.number} is {args.number ** 2}")
    

    6.2 例子2:运行FastAPI

    from fastapi import FastAPI, HTTPException, Response
    from pydantic import BaseModel
    import argparse
    import uvicorn
    
    app = FastAPI()
    # 定义问答对
    QA_para = {
        "Hello": "你好呀,很高兴为你服务",
        "你是谁?": "我是大模型"
    }
    
    # 定义请求体的数据模型
    class Question(BaseModel):
        question: str
    
    # 定义响应体的数据模型
    class Answer(BaseModel):
        answer: str
    
    @app.post("/QA/", response_model=Answer)
    async def get_answer(question_data: Question, response: Response):
        # 尝试从 QA_para 中获取答案,如果找不到则返回默认信息
        answer = QA_para.get(question_data.question, "对不起,我不知道答案是什么。")
    
        # 返回一个 JSON 格式的回答,并使用 Answer 模型进行验证
        return Answer(answer=answer)
        
    if __name__ == "__main__":
        parser = argparse.ArgumentParser(description='Run this program to test argparse')
        
        # 添加命令行参数
        parser.add_argument("--host", type=str, default="127.0.0.1")
        parser.add_argument("--port", type=int, default=8000)
        
        # 解析命令行参数
        args = parser.parse_args()
        
        # 将命名空间转换为字典
        args_dict = vars(args)
        print(f"\n > > > > > > \033[91m{args_dict}\033[0m: \n {args_dict} \n")
        
        # 启动 Uvicorn 服务器
        # 注意:这里没有使用 workers 参数,因为它不适合与 --reload 一起使用。
        # 如果你需要多工作进程,请考虑部署到生产环境时再配置。
        uvicorn.run("main:app", host=args.host, port=args.port, reload=True)  # 使用 reload=True 以便于开发
    

    使用这种方法运行fastapi程序,只需要输入python main.py即可。

    七、相关链接

    参考文章:

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

    相关文章:

    【Python】argparse模块
    【Python】request函数
    【Python】yield函数
    【Python】Uvicorn服务器
    【Python】SSE(Server-Sent Events)
    【Python】pydantic库
    【Python】pip用法
    【Python】Starlette框架
    【Python】pip用法

    作者:小豆豆儿

    物联沃分享整理
    物联沃-IOTWORD物联网 » 【Python】argparse模块

    发表回复