【Python】argparse模块

打印 上一主题 下一主题

主题 992|帖子 992|积分 2976

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
一、简介

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



  • 要开始使用argparse,首先需要导入模块并创建一个ArgumentParser对象。
    这个对象用于配置如何解析命令行参数。
    例如:
  1. import argparse
  2. parser = argparse.ArgumentParser(description='Calculate the square of a number.')
复制代码


  • 接下来,可以通过调用add_argument()方法来指定盼望解析的参数。
    对于每个参数,你可以设置它的名称或标志(flags)、范例、默认值、帮助文本等属性。
  1. parser.add_argument('number', type=int, help='The number to be squared.')
复制代码


  • 一旦全部必要的参数都被添加到ArgumentParser实例中,就可以调用parse_args()方法来解析实际传入的命令行参数了。
    这将返回一个包罗全部解析后参数的对象,通常是一个Namespace实例。
  1. args = parser.parse_args()
  2. print(f"The square of {args.number} is {args.number ** 2}")
复制代码
这段代码定义了一个简朴的命令行工具,它可以吸收一个整数作为位置参数,并计算该数字的平方。
三、参数范例

argparse支持多种范例的参数,包罗位置参数和可选参数。


  • 位置参数是指那些根据它们在命令行中的位置来确定意义的参数;
  • 而可选参数则是带有前缀(通常是-或--)的标志,用户可以选择是否提供它们。
    例如:
  1. # 定义一个可选参数
  2. 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选项)时会显示。
  1. parser = argparse.ArgumentParser(description='Process some integers.')
复制代码


  • epilog:帮助信息的最后一部分,通常用于提供额外的信息或示例。这部分内容会在全部参数的帮助信息之后显示。
  1. parser = argparse.ArgumentParser(epilog='Example usage: prog.py [options] file1 file2')
复制代码


  • formatter_class:控制帮助信息格式化的类,默认使用的是argparse.HelpFormatter。
  • 可以通过指定不同的类来自定义帮助信息的格式,例如argparse.RawDescriptionHelpFormatter可以保持原始描述文本格式稳定。
  1. parser = argparse.ArgumentParser(formatter_class=argparse.RawDescriptionHelpFormatter)
复制代码


  • argument_default:设置全部参数的默认值。注意,这会影响全部未明确指定默认值的参数,因此应审慎使用。
  1. parser = argparse.ArgumentParser(argument_default=argparse.SUPPRESS)  # 不设置默认值
复制代码


  • conflict_handler:处理辩论选项的方式,默认为'error',即碰到重复选项时报错;
    另一种选择是'resolve',它会实验解决辩论。
  1. parser = argparse.ArgumentParser(conflict_handler='resolve')
复制代码


  • add_help:是否自动添加-h/--help选项,默认为True。
    如果设为False,则必须手动添加帮助选项。
  1. parser = argparse.ArgumentParser(add_help=False)
复制代码


  • allow_abbrev:允许缩写长选项名称,默认为True。
  • 从Python 3.5开始引入此参数,以增强安全性。
  1. parser = argparse.ArgumentParser(allow_abbrev=False)
复制代码
parents:一个包罗其他ArgumentParser对象的列表,这些对象的参数也会被当前解析器继承。
这对于复用现有的参数配置非常有用。
  1. parent_parser = argparse.ArgumentParser(add_help=False)
  2. parent_parser.add_argument('--parent_option', type=int)parser = argparse.ArgumentParser(parents=[parent_parser])
复制代码


  • prefix_chars:定义前缀字符集,默认为'-',这意味着选项可以从前缀-或--开头。
    你可以改变这个聚集来支持不同的前缀字符。
  1. parser = argparse.ArgumentParser(prefix_chars='-+')
复制代码


  • fromfile_prefix_chars:允许从文件读取更多参数,指定哪些字符体现从文件加载参数。
    例如,如果你设置了fromfile_prefix_chars='@',那么命令行中的@filename将指示解析器从filename文件中读取附加参数。
  1. parser = argparse.ArgumentParser(fromfile_prefix_chars='@')
复制代码


  • prog:程序名,用于天生帮助信息中的程序名称部分。
    如果不指定,则默认取自sys.argv[0]。
  1. parser = argparse.ArgumentParser(prog='my_program')
复制代码


  • usage:自定义用法字符串,覆盖默认天生的帮助信息中的用法部分。
    若未提供,则根据已添加的参数自动天生。
  1. parser = argparse.ArgumentParser(usage='%(prog)s [options]')
复制代码


  • exit_on_error:决定在碰到错误时是否退出,默认为True。
    如果设为False,则可以在捕捉到错误后继承执行代码,而不是立即停止程序。
  1. 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_true 和 store_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 模块来解析命令行参数,并计算给定数字的平方。
  1. import argparse
  2. parser = argparse.ArgumentParser(description='Calculate the square of a number.')
  3. parser.add_argument('number', type=int, help='The number to be squared.')
  4. args = parser.parse_args()
  5. print(f"The square of {args.number} is {args.number ** 2}")
复制代码
该程序使用了 argparse 模块来解析命令行参数,并计算给定数字的平方。
要执行这段代码,你需要将上述代码生存到了一个 .py 文件中,例如定名为 square.py。
这一步非常紧张,因为我们将通过命令行来调用这个脚本并通报参数。
接下来,在命令行(对于 Windows 用户是 CMD 或 PowerShell;
对于 macOS 和 Linux 用户是终端)中切换到包罗 square.py 文件的目录。
然后你可以使用如下命令格式来运行它:
  1. python square.py [number]
复制代码
这里 [number] 是你想要计算其平方的谁人整数。比如,如果你想计算 4 的平方,你应该输入:
  1. python square.py 4
复制代码
执行上述命令后,程序会输出:
  1. The square of 4 is 16
复制代码
参数分析
   

  • python:这是用来启动 Python 表明器的命令。
  • square.py:这是你要运行的 Python 脚本的名字。
  • 4:这是一个位置参数,代表你想要求平方的谁人整数值。在这个例子中,我们通报了 4 作为参数值。
  

  • 在jupyter notebook运行
  1. import sysimport argparsefrom io import StringIO# 模拟命令行输入test_input = ['prog', '4']  # 假设我们想计算4的平方sys.argv = test_inputparser = argparse.ArgumentParser(description='Calculate the square of a number.')parser.add_argument('number', type=int, help='The number to be squared.')
  2. args = parser.parse_args()
  3. print(f"The square of {args.number} is {args.number ** 2}")
复制代码
6.2 例子2:运行FastAPI

  1. from fastapi import FastAPI, HTTPException, Response
  2. from pydantic import BaseModel
  3. import argparse
  4. import uvicorn
  5. app = FastAPI()
  6. # 定义问答对
  7. QA_para = {
  8.     "Hello": "你好呀,很高兴为你服务",
  9.     "你是谁?": "我是大模型"
  10. }
  11. # 定义请求体的数据模型
  12. class Question(BaseModel):
  13.     question: str
  14. # 定义响应体的数据模型
  15. class Answer(BaseModel):
  16.     answer: str
  17. @app.post("/QA/", response_model=Answer)
  18. async def get_answer(question_data: Question, response: Response):
  19.     # 尝试从 QA_para 中获取答案,如果找不到则返回默认信息
  20.     answer = QA_para.get(question_data.question, "对不起,我不知道答案是什么。")
  21.     # 返回一个 JSON 格式的回答,并使用 Answer 模型进行验证
  22.     return Answer(answer=answer)
  23.    
  24. if __name__ == "__main__":
  25.     parser = argparse.ArgumentParser(description='Run this program to test argparse')
  26.    
  27.     # 添加命令行参数
  28.     parser.add_argument("--host", type=str, default="127.0.0.1")
  29.     parser.add_argument("--port", type=int, default=8000)
  30.    
  31.     # 解析命令行参数
  32.     args = parser.parse_args()
  33.    
  34.     # 将命名空间转换为字典
  35.     args_dict = vars(args)
  36.     print(f"\n > > > > > > \033[91m{args_dict}\033[0m: \n {args_dict} \n")
  37.    
  38.     # 启动 Uvicorn 服务器
  39.     # 注意:这里没有使用 workers 参数,因为它不适合与 --reload 一起使用。
  40.     # 如果你需要多工作进程,请考虑部署到生产环境时再配置。
  41.     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用法

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

悠扬随风

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表