[Python]尺度库argparse剖析下令行参数利用先容

[复制链接]
发表于 2026-5-31 17:13:42 | 显示全部楼层 |阅读模式

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

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

×
媒介

argparse 是python尺度库中用于剖析下令行参数的模块。
根本利用
  1. import argparse
  2. # 创建解析器
  3. ## description: 程序说明
  4. ## prog: 程序名, 默认为脚本名
  5. ## epilog: 帮助信息末尾附加文本
  6. ## formatter_class: 控制帮助信息的展示样式
  7. parser = argparse.ArgumentParser(
  8.     prog="/my_tool",
  9.     description="A simple command-line tool.",
  10.     epilog="Example usage: /my_tool 'Hello World' --verbose"
  11. )
  12. # 使用add_argument() 添加参数
  13. # echo1和echo2为位置参数,使用时必需按顺序提供
  14. # type 指定类型转换函数
  15. # help 设置帮助说明
  16. parser.add_argument("echo1", type=str, help="echo something")
  17. parser.add_argument("echo2", type=str, help="echo something")
  18. # -x 或 --xx 为可选参数
  19. # default 设置默认值
  20. parser.add_argument("--sftp_ip",type=str,default="127.0.0.1", help="sftp服务的IP地址")
  21. # 自动转换类型成int
  22. # metavar 修改帮助信息中显示的占位名
  23. parser.add_argument("--sftp_port", metavar="PORT", type=int, default="22")
  24. # dest 指定解析后属性名, 解析后使用 args.username 访问
  25. parser.add_argument("--user-name", dest="username")
  26. # required 让可选参数变成必须提供
  27. # required 只适用于可选参数
  28. parser.add_argument("--name", required=True)
  29. # choice 限制可选值范围
  30. parser.add_argument("-H","--host",type=str, choices=["127.0.0.1", "192.168.0.10"])
  31. # nargs 控制参数个数
  32. ## nargs=2, 必须 2 个参数
  33. ## nargs='*', 0个或多个参数
  34. ## nargs='+', 1个或多个参数
  35. ## nargs='?', 0个或1个参数
  36. parser.add_argument('--nums', nargs=3, type=int)
  37. # 创建互斥组,-v和-q不能同时使用
  38. group = parser.add_mutually_exclusive_group()
  39. # action 定义参数行为
  40. group.add_argument("-v", "--verbose", action="store_true")
  41. group.add_argument("-q", "--quiet", action="store_true")
  42. # 解析参数
  43. # 返回的是一个 Namespace 对象
  44. args = parser.parse_args()
  45. # 使用命令参数
  46. print(f"echo1: {args.echo1}, echo2: {args.echo2}")
  47. print(f"sftp服务的IP为: {args.sftp_ip}, 端口号: {args.sftp_port}")
  48. print(f"host is {args.host}")
复制代码
argparse会主动天生资助选项-h和--help。
action参数

add_argument() 中的 action 参数用来界说参数活动。默认值为store.

  • action='store_true', 常用于布尔开关,  不传则为 False
  1. parser.add_argument('--verbose', action='store_true')
  2. # 运行 python app.py --verbose
  3. # 解析后
  4. args.verbose == True
复制代码

  • action='store_false', 反向布尔开关
  • action='append', 每出现一次就追加到列表
  1. parser.add_argument('--tag', action='append')
  2. # 使用
  3. python app.py --tag a --tag b
  4. # 得到
  5. args.tag == ['a', 'b']
复制代码

  • action='count', 统计出现次数
  1. parser.add_argument('-v', '--verbose', action='count', default=0)
  2. # 使用
  3. python app.py -vvv
  4. # 得到
  5. args.verbose == 3
复制代码

  • action='version', 打印版本
  1. parser.add_argument('--version', action='version', version='v1.0.0', default=0)
  2. # 使用
  3. python app.py --version
  4. # 输出 v1.0.0
  5. # 也可以写个函数来动态获取
  6. def get_version() -> str:
  7.     return "v1.0.0"
  8. # help 不传的话默认为 show program's version number and exit
  9. parser.add_argument(
  10.     "--version",
  11.     action="version",
  12.     version=get_version(),
  13.     # help="Show the version of the tool and exit.",
  14. )
复制代码

  • action='store_const', 设置为指定值
  1. parser.add_argument('--json', action='store_const', const='json', dest='format')
  2. # 运行
  3. python app.py --json
  4. # 得到
  5. args.format == 'json'
复制代码
互斥参数

创建互斥组:group = parser.add_mutually_exclusive_group()
利用group.add_argument设置的下令行选项将互斥,不能同时利用
简朴例子:
  1. import argparse
  2. parser = argparse.ArgumentParser()
  3. # 创建互斥组
  4. # 传入 required=True 的话,用户必须从互斥组参数中选一个; 默认用户可以不选可选组参数
  5. group = parser.add_mutually_exclusive_group()
  6. group.add_argument('--verbose', action='store_true')
  7. group.add_argument('--quiet', action='store_true')
  8. args = parser.parse_args()
  9. print(args)
  10. # 这样同时调用会报错
  11. python app.py --verbose --quiet
复制代码
子下令

当下令行工具包罗多种操纵时大概就会须要子下令了,比方:
  1. python tool.py add user1
  2. python tool.py delete user1
  3. python tool.py list
复制代码
这里add, delete, list 都是子下令, 这时间最适当用 parser.add_subparsers()
add_subparsers() 用来给一个下令行步伐添加多个子剖析器(subparsers),每个子剖析器对应一个子下令。
根本用法
  1. import argparse
  2. parser = argparse.ArgumentParser(prog='usercli', description='用户管理工具')
  3. # required=True, 强制用户使用子命令
  4. # 建议总是显式写 dest='command'
  5. subparsers = parser.add_subparsers(dest='command', required=True)
  6. # add 子命令
  7. parser_add = subparsers.add_parser('add', help='添加用户')
  8. parser_add.add_argument('username', help='用户名')
  9. parser_add.add_argument('--age', type=int, default=18, help='年龄')
  10. # delete 子命令
  11. parser_delete = subparsers.add_parser('delete', help='删除用户')
  12. parser_delete.add_argument('username', help='用户名')
  13. # list 子命令
  14. parser_list = subparsers.add_parser('list', help='列出用户')
  15. parser_list.add_argument('--verbose', action='store_true', help='显示详细信息')
  16. args = parser.parse_args()
  17. if args.command == 'add':
  18.     print(f'添加用户: {args.username}, 年龄: {args.age}')
  19. elif args.command == 'delete':
  20.     print(f'删除用户: {args.username}')
  21. elif args.command == 'list':
  22.     print(f'列出用户, verbose={args.verbose}')
复制代码
子下令绑定处置惩罚函数

上面根本用法中用if/elif 来分发逻辑,简朴场景下还拼集,但是当下令多,功能复杂时,代码会显得非常杂乱,这种情况下就可以为子下令绑定处置惩罚函数。
示例代码:
  1. import argparse
  2. def handle_add(args):
  3.     print(f'添加用户: {args.username}, 年龄: {args.age}')
  4. def handle_delete(args):
  5.     print(f'删除用户: {args.username}')
  6. def handle_list(args):
  7.     print(f'列出用户, verbose={args.verbose}')
  8. def create_parser() -> argparse.ArgumentParser:
  9.     parser = argparse.ArgumentParser(prog='usercli')
  10.     subparsers = parser.add_subparsers(dest='command', required=True)
  11.     parser_add = subparsers.add_parser('add', help='添加用户')
  12.     parser_add.add_argument('username')
  13.     parser_add.add_argument('--age', type=int, default=18)
  14.     parser_add.set_defaults(func=handle_add)
  15.     parser_delete = subparsers.add_parser('delete', help='删除用户')
  16.     parser_delete.add_argument('username')
  17.     parser_delete.set_defaults(func=handle_delete)
  18.     parser_list = subparsers.add_parser('list', help='列出用户')
  19.     parser_list.add_argument('--verbose', action='store_true')
  20.     parser_list.set_defaults(func=handle_list)
  21.     return parser
  22. def main() -> None:
  23.     parser = create_parser()
  24.     args = parser.parse_args()
  25.     # 如果用了 args.func(args)
  26.     # 一定要确保每个子命令都执行了 parser_xxx.set_defaults(func=...)
  27.     # 否则报错: AttributeError: 'Namespace' object has no attribute 'func'
  28.     args.func(args)
  29. if __name__ == "__main__":
  30.     main()
复制代码
子下令共享公共参数

如果多个子下令都须要同一组参数,可以抽一个“父剖析器”。
  1. import argparse
  2. def main():
  3.     common_parser = argparse.ArgumentParser(add_help=False)
  4.     common_parser.add_argument('--config', help='配置文件路径')
  5.     parser = argparse.ArgumentParser(prog='tool')
  6.     subparsers = parser.add_subparsers(dest='command', required=True)
  7.     parser_a = subparsers.add_parser('start', parents=[common_parser])
  8.     parser_a.add_argument('--port', type=int)
  9.     parser_b = subparsers.add_parser('stop', parents=[common_parser])
  10.     parser_b.add_argument('--force', action='store_true')
  11.     # 解析命令行参数
  12.     # common_parser 是一个共享参数模板, 不需要参与参数解析
  13.     args = parser.parse_args()
  14.     if args.command == 'start':
  15.         print(f"Starting with config: {args.config} on port: {args.port}")
  16.     elif args.command == 'stop':
  17.         print(f"Stopping with config: {args.config} {'forcefully' if args.force else ''}")
  18.     else:
  19.         print("Unknown command")
  20. if __name__ == "__main__":
  21.     main()
复制代码
子下令设置别名
  1. parser_remove = subparsers.add_parser('remove', aliases=['rm'])
复制代码
如许两种下令都可以
  1. python tool.py remove file.txt
  2. python tool.py rm file.txt
复制代码
嵌套子下令

复杂 CLI 大概有多级下令,好比:
  1. tool user add alice
  2. tool user delete bob
复制代码
可以嵌套 add_subparsers():
  1. import argparse
  2. parser = argparse.ArgumentParser(prog='tool')
  3. subparsers = parser.add_subparsers(dest='entity', required=True)
  4. user_parser = subparsers.add_parser('user')
  5. user_subparsers = user_parser.add_subparsers(dest='action', required=True)
  6. user_add = user_subparsers.add_parser('add')
  7. user_add.add_argument('name')
  8. user_delete = user_subparsers.add_parser('delete')
  9. user_delete.add_argument('name')
  10. args = parser.parse_args()
  11. print(args)
复制代码
运行:
  1. python tool.py user add alice
复制代码
得到:
  1. Namespace(entity='user', action='add', name='alice')
复制代码
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表