Python 利用argparse模块实现脚本命令行参数解析
作者:授客 发布时间:2022-12-01 16:11:55
标签:Python,脚本命令行,argparse
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
结果如下
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
运行结果如下
来源:https://www.cnblogs.com/shouke/archive/2020/12/27/14198784.html


猜你喜欢
- 1. ES语法的getter和setter在开始了解 Vue 的数据响应式原理前应该先搞清楚 ES语法 中的 getter 和 setter
- 一、了解Variable顾名思义,Variable就是 变量 的意思。实质上也就是可以变化的量,区别于int变量,它是一种可以变化的变量,这
- 如果管理网络设备很多,不可能靠人力每天去登录设备去查看是否在线。所以,可以利用python脚本通过每天扫描网络中的在线设备。可以部署在服务器
- 前言Python环境的搭建这里就不赘述了,有需要的小伙伴可以在网上搜罗出很多教程,注意安装PyChom编辑工具。这次我们主要讲一下几点内容:
- 简介procedure analyse()函数是MySQL内置的对MySQL字段值进行统计分析后给出建议的字段类型。语法procesure
- 50个常用sql语句 Student(S#,Sname,Sage,Ssex) 学生表 Course(C#,Cname,T#) 课程表 SC(
- 1.插入数据insert into表名(列名1,列名2,列名..) values(值1,值2,值...); insert into
- 本文实例讲述了Python反射的用法。分享给大家供大家参考,具体如下:在做程序开发中,我们常常会遇到这样的需求:需要执行对象里的某个方法,或
- 本文实例讲述了php中fgetcsv()函数用法。分享给大家供大家参考。具体方法如下:fgetcsv是一个简单的生成excel文档的函数,从
- 例子:以百度文库中选择文档的类型为例问题一:遍历点击所有文档类型的单选框# coding=utf-8from selenium import
- 1)用这个方法,把虚拟主机的默认页只设置成一个比如index.asp 在index.asp的最上面加入以下代码:<%if R
- 因为要写个东西用到,所以百度了一下,居然有朋友乱写,而且比较多,都没有认真测试过,只对字符可以,但是对数字就不可以,而且通用性很差,需要修改
- 1. 引言在Python开发中,itertools库经常被忽视,实际上该库中抱恨了一些非常棒的函数,特别是用于处于数据流的函数。在本文中,我
- 在网上找了找也没找到合适的最后自己测试用 存入:Replace("\r\n", "<br/>&qu
- 通过phpmyadmin连接mysql数据库时提示:“2003 无法登录 MySQL服务器”。。。很明显这是没有启动mysql服务,右击我的
- Python追求简洁,诞生不少运算赋值规则,力求从简,其中就包括两个或者多个变量交换值。普通语言中# 声明变量a=50b=10# 开始交换,
- 前言Pycharm学习过程中,每次在一个Pycharm窗口建立一个新的文件夹,都需要重新配置anaconda环境。由于本人是初学者,所以写一
- 一、QtDesigner介绍Qt Designer 是一款GUI界面工具,可以实现将UI设计界面转为Python代码的工具;二、安装 QTd
- isset($var); //为false 没有定义没有定义为假 $var = ''
- 随着电子邮件的广泛使用,垃圾邮件也日益增多,对用户造成了很大的困扰。因此,开发一个能够自动分类和过滤垃圾邮件的程序就显得非常重要。本篇文章将