Python 利用argparse模块实现脚本命令行参数解析

简介: Python 利用argparse模块实现脚本命令行参数解析

利用argparse模块实现脚本命令行参数解析



 

#代码实践1

study.py内容如下

#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = 'shouke'
import argparse
def argparseFunc():
  '''
  基于argparse模块实现命令参数解析功能
  执行示例:
       python study.py -i 172.19.7.236 -p 8080 -a -r
       python study.py --ip 172.19.7.236 --port 7077 --auth -w -v True
  '''
  parser = argparse.ArgumentParser(description="study.py usage help document")
  # 添加不带默认值的可解析参数
  parser.add_argument("-i", "--ip", help="ip addr") #注意: -h、--help为内置参数,不可用
  parser.add_argument("-p", "--port",help="host port")
  # 添加带默认值的可解析参数(# action = store_true 表示是如果使用了这个参数,则值参数值设置为True # 更多action配置可参考源码
  # 需要注意的是,不能为带默认值参数指定参数值,会报错,该参数值会被当作不识别的参数
  parser.add_argument("-a", "--auth", help="if auth need", action="store_true")
  # 添加互斥参数(比如 例中的-r和-w 同时只能用一个)
  exclusive_group = parser.add_mutually_exclusive_group()
  exclusive_group.add_argument("-r","--read", help="read enabled" , action="store_true")
  exclusive_group.add_argument("-w","--write", help="write enabled", action="store_true")
  # 添加参数时不设置设置参数说明
  parser.add_argument('-v') # show verbose
  # 添加参数时不设置参数全名
  parser.add_argument('-V', help="version")
  ARGS = parser.parse_args() # 获取命令行参数
  print('ARGS:', ARGS)
  # 获取某个参数值
  if ARGS.ip: # 注意,这里的参数名,必须使用参数全称
    print("host addr is: %s" % ARGS.ip)
  if ARGS.port:
    print("host port is: : %s" % ARGS.port)
  if ARGS.auth:
    print("auth need: : %s" % ARGS.auth)
  if ARGS.read:
    print("read enabled: %s" % ARGS.read)
  if ARGS.write:
    print("write enabled: %s" % ARGS.write)
argparseFunc()


运行测试

python study.py -i 172.19.7.236 -p 8080 -a -r
python study.py --ip 172.19.7.236 --port 7077 --auth -w -v True

结果如下

 

1

python study.py -i127.0.0.1# 注意,参数和参数值之间可以没有空格


结果如下

 

python study.py -notExists 1

结果如下

 

如上,以上代码实现是针对单个模块脚本,如果要在多个模块中使用咋办?解决方法为封装为类,具体参见“代码实践2”

 

#代码实践2

argument_parser.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
'''
@Author : shouke
'''
import argparse
class ArgParser(object):
  '''
     参数解析器
  '''
  def __init__(self,  none_exclusive_arguments, exclusive_arguments, description=''):
      self.parser =  argparse.ArgumentParser(description=description)
      self.add_none_exclusive_arguments(none_exclusive_arguments)
      self.add_exclusive_arguments(exclusive_arguments)
  def add_none_exclusive_arguments(self, options:list):
      '''
      添加常规选项(非互斥选项)
      :param options 格式为list类型,形如
      [
          '"-a", "--all", help="do not ignore entries starting with ."',
          '"-b", "--block", help="scale sizes by SIZE before printing them"',
          '"-C", "--color", help="colorize the output; WHEN can be 'never', 'auto'"',
          '"-flag", help="make flag", action="store_true"', # action="store_true" 表示如果不设置该选项的值,则默认值为true,类似的action="store_false" 表示默认值为false
      ]
      其中,每个list元素为argparse.ArgumentParserlei add_argument类函数实参的字符串表示,add_argument函数定义add_argument(self, *args,**kwargs)
      '''
      for option in options:
          eval('self.parser.add_argument(%s)' % option)
  def add_exclusive_arguments(self, options:list):
      '''
      添加互斥选项
      :param options 格式为list,形如以下
       [
           ('"-r","--read",help="Read Action",action="store_true"',
            '"-w","--write",help="Write Action",action="store_true"')
       ]
      '''
      for option_tuple in options:
          exptypegroup = self.parser.add_mutually_exclusive_group()
          for item in option_tuple:
              eval('exptypegroup.add_argument(%s)' % item)
  @property
  def args(self):
      return self.parser.parse_args()

在xxx.py中引用(注意:为了让参数解析器起到应起的作用,建议在脚本最上方构造参数解析器对象)

 

study.py内容如下

#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = 'shouke'
from argument_parser import ArgParser
none_exclusive_arguments = [
    '"-ip", help="自动化测试服务平台地址"',
    '"-projectId", help="自动化测试项目id"',
    '"-runEnv", help="自动化测试项目运行环境"',
    '"-logLevel", help="日志级别"',
    '"-masterHost", help="master服务地址"',
    '"-masterPort", help="master服务端口"'
]
exclusive_arguments = [
   ('"-r", "--read", help="Read Action",action="store_true"',
    '"-w", "--write", help="Write Action",action="store_true"')
]
args = ArgParser(none_exclusive_arguments, exclusive_arguments).args
print(args)
print(args.ip)
print(args.read)

运行测试

python study.py -i 127.0.0.1 -r

运行结果如下

 

image.png

 

目录
相关文章
|
10月前
|
JSON 自然语言处理 Java
OpenAI API深度解析:参数、Token、计费与多种调用方式
随着人工智能技术的飞速发展,OpenAI API已成为许多开发者和企业的得力助手。本文将深入探讨OpenAI API的参数、Token、计费方式,以及如何通过Rest API(以Postman为例)、Java API调用、工具调用等方式实现与OpenAI的交互,并特别关注调用具有视觉功能的GPT-4o使用本地图片的功能。此外,本文还将介绍JSON模式、可重现输出的seed机制、使用代码统计Token数量、开发控制台循环聊天,以及基于最大Token数量的消息列表限制和会话长度管理的控制台循环聊天。
3296 7
|
Python
命令行解析工具 argparse
命令行解析工具 argparse
116 14
|
JSON API 数据格式
requests库中json参数与data参数使用方法的深入解析
选择 `data`或 `json`取决于你的具体需求,以及服务器端期望接收的数据格式。
792 2
|
12月前
|
存储 缓存 并行计算
yolov5的train.py的参数信息解析
这篇文章解析了YOLOv5的`train.py`脚本中的参数信息,详细介绍了每个参数的功能和默认值,包括权重路径、模型配置、数据源、超参数、训练轮数、批量大小、图像尺寸、训练选项、设备选择、优化器设置等,以便用户可以根据需要自定义训练过程。
448 0
|
存储 Python
30天拿下Python之argparse模块
30天拿下Python之argparse模块
95 0
|
C# 开发者 Windows
震撼发布:全面解析WPF中的打印功能——从基础设置到高级定制,带你一步步实现直接打印文档的完整流程,让你的WPF应用程序瞬间升级,掌握这一技能,轻松应对各种打印需求,彻底告别打印难题!
【8月更文挑战第31天】打印功能在许多WPF应用中不可或缺,尤其在需要生成纸质文档时。WPF提供了强大的打印支持,通过`PrintDialog`等类简化了打印集成。本文将详细介绍如何在WPF应用中实现直接打印文档的功能,并通过具体示例代码展示其实现过程。
1140 0
|
7月前
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
658 29
|
7月前
|
前端开发 数据安全/隐私保护 CDN
二次元聚合短视频解析去水印系统源码
二次元聚合短视频解析去水印系统源码
191 4
|
7月前
|
JavaScript 算法 前端开发
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
7月前
|
移动开发 前端开发 JavaScript
从入门到精通:H5游戏源码开发技术全解析与未来趋势洞察
H5游戏凭借其跨平台、易传播和开发成本低的优势,近年来发展迅猛。接下来,让我们深入了解 H5 游戏源码开发的技术教程以及未来的发展趋势。

推荐镜像

更多