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

 

目录
相关文章
|
15天前
|
Python
python函数的参数学习
学习Python函数参数涉及五个方面:1) 位置参数按顺序传递,如`func(1, 2, 3)`;2) 关键字参数通过名称传值,如`func(a=1, b=2, c=3)`;3) 默认参数设定默认值,如`func(a, b, c=0)`;4) 可变参数用*和**接收任意数量的位置和关键字参数,如`func(1, 2, 3, a=4, b=5, c=6)`;5) 参数组合结合不同类型的参数,如`func(1, 2, 3, a=4, b=5, c=6)`。
16 1
|
1天前
|
存储 SQL 缓存
阿里云大学考试python中级题目及解析-python中级
阿里云大学考试python中级题目及解析-python中级
|
3天前
|
JavaScript IDE 编译器
TypeScript中模块路径解析与配置:深入剖析与最佳实践
【4月更文挑战第23天】本文深入探讨了TypeScript中模块路径解析的原理与配置优化,包括相对路径、Node.js模块解析和路径别名。通过配置`baseUrl`、`paths`、`rootDirs`以及避免裸模块名,可以提升开发效率和代码质量。建议使用路径别名增强代码可读性,保持路径结构一致性,并利用IDE插件辅助开发。正确配置能有效降低维护成本,构建高效可维护的代码库。
|
4天前
|
前端开发 Java
SpringBoot之实体参数的详细解析
SpringBoot之实体参数的详细解析
10 0
|
6天前
|
数据采集 机器学习/深度学习 数据挖掘
Python数据清洗与预处理面试题解析
【4月更文挑战第17天】本文介绍了Python数据清洗与预处理在面试中的常见问题,包括Pandas基础操作、异常值处理和特征工程。通过示例代码展示了数据读取、筛选、合并、分组统计、离群点检测、缺失值和重复值处理、特征缩放、编码、转换和降维。强调了易错点,如忽视数据质量检查、盲目处理数据、数据隐私保护、过度简化特征关系和忽视模型输入要求。掌握这些技能和策略将有助于在面试中脱颖而出。
23 8
|
9天前
|
调度 Python
Python多线程、多进程与协程面试题解析
【4月更文挑战第14天】Python并发编程涉及多线程、多进程和协程。面试中,对这些概念的理解和应用是评估候选人的重要标准。本文介绍了它们的基础知识、常见问题和应对策略。多线程在同一进程中并发执行,多进程通过进程间通信实现并发,协程则使用`asyncio`进行轻量级线程控制。面试常遇到的问题包括并发并行混淆、GIL影响多线程性能、进程间通信不当和协程异步IO理解不清。要掌握并发模型,需明确其适用场景,理解GIL、进程间通信和协程调度机制。
28 0
|
9天前
|
API Python
Python模块化编程:面试题深度解析
【4月更文挑战第14天】了解Python模块化编程对于构建大型项目至关重要,它涉及代码组织、复用和维护。本文深入探讨了模块、包、导入机制、命名空间和作用域等基础概念,并列举了面试中常见的模块导入混乱、不适当星号导入等问题,强调了避免循环依赖、合理使用`__init__.py`以及理解模块作用域的重要性。掌握这些知识将有助于在面试中自信应对模块化编程的相关挑战。
21 0
|
10天前
05-python之函数-函数的定义/函数的参数/函数返回值/函数说明文档/函数的嵌套使用/函数变量的作用域
05-python之函数-函数的定义/函数的参数/函数返回值/函数说明文档/函数的嵌套使用/函数变量的作用域
|
12天前
|
SQL API 数据库
Python中的SQLAlchemy框架:深度解析与实战应用
【4月更文挑战第13天】在Python的众多ORM(对象关系映射)框架中,SQLAlchemy以其功能强大、灵活性和易扩展性脱颖而出,成为许多开发者首选的数据库操作工具。本文将深入探讨SQLAlchemy的核心概念、功能特点以及实战应用,帮助读者更好地理解和使用这一框架。
|
14天前
|
存储 JSON JavaScript
「Python系列」Python JSON数据解析
在Python中解析JSON数据通常使用`json`模块。`json`模块提供了将JSON格式的数据转换为Python对象(如列表、字典等)以及将Python对象转换为JSON格式的数据的方法。
29 0

推荐镜像

更多