自定义 Python 程序参数解析

需要通过Python程序运行其它应用程序,程序格式为:

我的程序 <我的程序参数> 应用程序 <应用程序参数>

由于应用程序不固定,应用程序的参数也不固定,我的程序不需要对应用程序参数进行解析,仅需要解析自己的参数。

看上去需求很简单,但试用了几个参数解析模块都不能满足此场景。比如流行的 argparse 库就无法区分我的程序参数和应用程序参数,而且如果我的程序参数和应用程序参数同名,它会认为都是我的程序参数。

因此只能自己编写自己的参数解析。

先梳理功能需求:

  1. 参数名称均以符号 ’-‘ 或 ’--‘ 开始,名称大小写敏感。
  2. 参数名称后可以跟参数值,也可以不跟参数值。
  3. 参数可重复,但只取最后出现的参数值。
  4. 不以符号 ’-‘ 开始的参数被认为是应用程序名称,其后的参数不再解析。

根据以上功能需求,编写了一个简单的工具类:

class ArgException(Exception):passclass ArgParser():def __init__(self):self.keys = ['arg', 'required', 'single', 'dest', 'help']self.args = []self.va_list = []self.usage = ''def add_arg(self, *arglist, **kargs):for k in kargs.keys():if k not in self.keys:e = f'{k} 不是合法属性。合法属性为:{" ".join(self.keys)}。'raise ArgException(e)self.args.append({'arg':arglist, **kargs})self.va_list += arglistdef find_arg(self, arg):for k in self.args:if arg in k['arg']:return kdef parse_arg(self):params = {}cmd = []emsg = ''i = 1while i < len(sys.argv):a = sys.argv[i]if a.startswith('-'):if a not in self.va_list:emsg += f"非法参数选项 {a} ,请指定合法参数选项。指定参数 -h 查看合法参数列表。\n"breakp = self.find_arg(a)if p['single']:params[p['dest']] = Truei += 1else:v = sys.argv[i+1]if v.startswith('-'):emsg += f"参数值缺失,请在参数选项 {a} 后指定参数值。\n"i += 1continueparams[p['dest']] = sys.argv[i+1]i += 2continueelse:cmd = sys.argv[i:]breakif len(emsg):raise ArgException(emsg)return params, cmddef set_usage(self, usage):self.usage += usageself.usage += '\n参数选项:\n'for k in self.args:self.usage += f"{' | '.join(k['arg']):20} {' ' if k['single'] else k['dest']:10} : {k['help']}\n"def print_usage(self):print(self.usage)

使用方法如下:

    parser = ArgParser()parser.add_arg('-P', '--project', required=True, single=False, dest='project', help='指定项目名称')

首先生成类的实例,然后调用 add_arg 增加参数定义:

  • 前面没有名称的为参数的合法名称,比如’-P', '--project' 都表示同一个参数;
  • required 表示此参数是不是必要,True 为必要。如果没有指定会报错;
  • single 表示此参数是否需要指定参数值,True 不需要指定,反之需要参数值
  • dest 表示参数名称
  • help 表示参数的说明

定义完参数后,可以加上参数说明

    usage = '''
psub -P <project name>  -q <queue_name> [-J <job name>] [-n <resource requirement>] [ -I ] [ -t <dispatch time window>] [-p <priority>] [-m <workstation>] [-W <run time limit>] [-U <resource reservation id>] cmd ...
'''parser.set_usage(usage)

第一行指定参数的使用说明。

第二行 set_usage 会从上面的参数定义中,抽取参数说明。

通过调用 print_uage 打印说明

parser.print_usage()

下面是使用示例

if __name__ == "__main__":parser = ArgParser()parser.add_arg('-P', '--project', required=True, single=False, dest='project', help='指定项目名称')parser.add_arg('-q', '--queue', required=False, single=False, dest='queue', help='指定队列名称')parser.add_arg('-J', '--jobname', required=False, single=False, dest='jobname', help='指定任务名称')parser.add_arg('-n', '--resource', required=False, single=False, dest='resource', help='指定资源需求')parser.add_arg('-I', '--interactive', required=False, single=True, dest='interact', help='要执行的任务为命令行交互式应用')parser.add_arg('-t', '--timewindow', required=False, single=False, dest='window', help='任务派发时间窗口;格式 HH:MM,HH:MM,不能跨天')parser.add_arg('-p', '--priority', required=False, single=False, dest='priority', help='指定任务优先级')parser.add_arg('-m', '--machine', required=False, single=False, dest='machine', help='指定任务运行的主机列表,格式 “machine1,machine2,machine3”')parser.add_arg('-W', '--runlimit', required=False, single=False, dest='runlimit', help='指定任务最长运行时间,默认以分钟为单位')parser.add_arg('-b', '--bookid', required=False, single=False, dest='bookid', help='指定任务使用的资源预订订单号')parser.add_arg('-h', '--help', required=False, single=True, dest='help', help='打印帮助信息')usage = '''
psub -P <project name>  -q <queue_name> [-J <job name>] [-n <resource requirement>] [ -I ] [ -t <dispatch time window>] [-p <priority>] [-m <workstation>] [-W <run time limit>] [-U <resource reservation id>] cmd ...
'''parser.set_usage(usage)params, cmd = parser.parse_arg()if 'help' in params.keys():parser.print_usage()sys.exit(0)print(f"params: {params}")print(f"cmd: {cmd}")

运行效果如下

$ python pxee.py -hpxee -P <project name>  -q <queue_name> [-J <job name>] [-n <resource requirement>] [ -I ] [ -t <dispatch time window>] [-p <priority>] [-m <workstation>] [-W <run time limit>] [-U <resource reservation id>] cmd ...参数选项:
-P | --project       project    : 指定项目名称
-q | --queue         queue      : 指定队列名称
-J | --jobname       jobname    : 指定任务名称
-n | --resource      resource   : 指定资源需求
-I | --interactive              : 要执行的任务为命令行交互式应用
-t | --timewindow    window     : 任务派发时间窗口;格式 HH:MM,HH:MM,不能跨天
-p | --priority      priority   : 指定任务优先级
-m | --machine       machine    : 指定任务运行的主机列表,格式 “machine1,machine2,machine3”
-W | --runlimit      runlimit   : 指定任务最长运行时间,默认以分钟为单位
-b | --bookid        bookid     : 指定任务使用的资源预订订单号
-h | --help                     : 打印帮助信息

正常解析

$ python pxee.py -P prj -q adam -J myjob -I verdi -P xx -q asf -I -x -o /tmp/asfdsf
params: {'project': 'prj', 'queue': 'adam', 'jobname': 'myjob', 'interact': True}
cmd: ['verdi', '-P', 'xx', '-q', 'asf', '-I', '-x', '-o', '/tmp/asfdsf']

异常情况

$ python pxee.py -Pxe prj -q adam -J myjob -I verdi -P xx -q asf -I -x -o /tmp/asfdsf
Traceback (most recent call last):File "/Users/bytedance/scheduler_investigation/pxee.py", line 106, in <module>params, cmd = parser.parse_arg()File "/Users/bytedance/scheduler_investigation/pxee.py", line 72, in parse_argraise ArgException(emsg)
__main__.ArgException: 非法参数选项 -Pxe ,请指定合法参数选项。指定参数 -h 查看合法参数列表。

以上仅是初步原型,还需要进一步完善,比如对 required 参数检查,没有指定需要告警;增加默认值等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/713011.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue+SpringBoot打造天然气工程运维系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统角色分类2.2 核心功能2.2.1 流程 12.2.2 流程 22.3 各角色功能2.3.1 系统管理员功能2.3.2 用户服务部功能2.3.3 分公司&#xff08;施工单位&#xff09;功能2.3.3.1 技术员角色功能2.3.3.2 材料员角色功能 2.3.4 安…

快速幂-计算a的b次对m取余

题目 题解参考 a a ∗ a a a*a aa∗a这部分是计算 a 2 i a^{2^i} a2i&#xff0c; a b Π i 0 t a n i 2 i Π i 0 t ( a 2 i ) n i a^b \Pi_{i0}^{t}a^{n_i 2^i} \Pi_{i0}^{t}(a^{2^i})^{n_i} abΠi0t​ani​2iΠi0t​(a2i)ni​ ,代码中的b&1是计算 n i n_i ni​…

Zabbix企业运维监控工具

Zabbix企业级监控方案 常见监控软件介绍 Cacti Cacti是一套基于 PHP、MySQL、SNMP 及 RRD Tool 开发的监测图形分析工具&#xff0c;Cacti 是使用轮询的方式由主服务器向设备发送数据请求来获取设备上状态数据信息的,如果设备不断增多,这个轮询的过程就非常的耗时&#xff0…

sql注入less46作业三

采用报错注入 updatexml(XML_document,XPath_string,new_value) 一共可以接收三个参数&#xff0c;报错位置在第二个参数。 ?sort1 and updatexml(1,concat(0x7e,database(),0x7e),1)-- #查询库名 ?sort1 and updatexml(1,concat(0x7e,(select group_concat(table_name) fr…

[每周一更]-(第89期):开源许可证介绍

开源代码本就是一种共享精神&#xff0c;一种大无畏行为&#xff0c;为了发扬代码的魅力&#xff0c;创造更多的价值&#xff0c;让爱传递四方&#xff0c;让知识惠及更多人&#xff1b; 写文章也是一种共享精神&#xff0c;让知识传播出去。 介绍下开源中不同许可证的内容限…

初学Vue总结

0 Vue概述 问题&#xff1a;我们已经学过了htmlCssjavascript,可以开发前端页面了&#xff0c;但会发现&#xff0c;效率太低了。那么&#xff0c;有没有什么工具可以提高我们的开发效率&#xff0c;加快开发速度呢&#xff1f; 他来了&#xff0c;他来了&#xff0c;他大佬似…

Spring注解之json 数据处理

目录 1. 过滤 json 数据 2. 格式化 json 数据 3. 扁平化对象 1. 过滤 json 数据 JsonIgnoreProperties 作用在类上用于过滤掉特定字段不返回或者不解析。 //生成json时将userRoles属性过滤 JsonIgnoreProperties({"userRoles"}) public class User { ​private S…

大宋咨询如何进行汽车门店6S标准现场检查

随着汽车市场的快速发展&#xff0c;汽车门店的现场管理日益受到关注。6S标准现场检查作为一项重要的评估工具&#xff0c;正在被越来越多的汽车厂商和经销商采用。 6S标准现场检查是指对汽车门店的整理、整顿、清洁、清扫、素养和安全六个方面进行规范和优化&#xff0c;旨在…

js中replaceAll在浏览器不兼容问题

前端项目有时候会出现浏览器使用replaceAll方法报错问题&#xff0c;原因是一些旧版浏览器对replaceAll不是很兼容 解决办法有三种&#xff1a; 1、str.replace(/word/g,“Excel”); g 的意义是&#xff1a;执行全局匹配&#xff08;查找所有匹配而非在找到第一个匹配后停止&am…

[AIGC] Java注解的生效时机详解

在Java中&#xff0c;Annotation&#xff08;注解&#xff09;是一种用于描述代码的元数据。它们可以为我们的代码提供额外的信息&#xff0c;这些信息可以在编译时或运行时被读取。而注解的生效时机&#xff0c;主要由Java的Retention注解来控制。 一、注解的生效时机 Java中…

-XX:MaxTenuringThreshold

-XX:MaxTenuringThreshold&#xff0c;XX:PrintTenuringDistribution 虚拟机提供一个年龄&#xff0c;默认是15&#xff0c;对象超过这个年龄范围就会晋升到老年代 【XX:PrintTenuringDistribution 可以输出age的额外信息】 -XX:MaxTenuringThreshold -> https://www.jians…

线性规划在多种问题形式下的应用

线性规划的用处非常的广泛&#xff0c;这主要是因为很多类型的问题是可以通过转化的方式转化为线性规划的问题。例如需要再图论中寻找起始点到给定的点的最短路径问题&#xff1a; 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 假设要计算从节点0到节点…

springboot配置多数据源以及事务问题

一、背景以及为什么需要学习 在高并发的项目中,单数据库已无法承载大数据量的访问,因此需要使用多个数据库进行对数据的读写分离,此外就是在微服化的今天,我们在项目中可能采用各种不同存储,因此也需要连接不同的数据库,居于这样的背景,这里简单分享实现的思路以及实现…

点亮城市名片丨计讯物联智慧灯杆系统在通讯基地的成功应用

项目背景 在国家新型城镇化大背景下&#xff0c;十四五规划纲要强调“加快数字化发展&#xff0c;建设数字中国”&#xff0c;明确提出“以数字化助推城乡发展和治理模式创新”&#xff0c;全面提高城市的运行效率和宜居程度。 项目概况 为满足灯杆灯光亮度的远程智能管理、对…

记录 android studio 通过安装NDK 编译C文件,得到需要的so文件

只怪自己太健忘&#xff0c;每次网上查了一圈&#xff0c;搞定后&#xff0c;再遇到又发现不会操作了&#xff0c;特此记下 不废话直接上步骤 &#xff08;1&#xff09; 进入AS的settinging如下界面 &#xff08;2&#xff09;选中图片箭头两个文件 进行下载 &#xff08;…

【知识管理】假设检验pvalue的计算

让我们通过一个具体的例子来解释P值的计算过程&#xff0c;假设我们有一个模型用于区分SCD&#xff08;亚临床痴呆&#xff09;和HC&#xff08;健康对照&#xff09;的分裂。我们通过置换测试来计算模型性能的P值。 原始模型性能评估 首先&#xff0c;我们在原始数据集上运行…

web学习笔记(二十一)

目录 1.构造函数创建对象 1.1规则 1.2 new关键字调用构造函数时&#xff0c;函数内部做了什么事情&#xff1f; 1.3总结 2.混合模式创建对象 3.JavaScript 继承---借助构造函数 4.原型链 4.1原型链实现方法继承 5.完美的组合继承 6.call方法的使用 1.构造函数创建对象…

React之数据绑定以及表单处理

一、表单元素 像<input>、<textarea>、<option>这样的表单元素不同于其他元素&#xff0c;因为他们可以通过用户交互发生变化。这些元素提供的界面使响应用户交互的表单数据处理更加容易 交互属性&#xff0c;用户对一下元素交互时通过onChange回调函数来监听…

回溯例题(leetcode17/37)

文章目录 leetcode37leetcode17 回溯跟枚举差不多。要注意“回溯”&#xff0c;别忘记“回”之前把之前的改动都复原。 leetcode37 leetcode37是解数独问题。本题保证有且仅有唯一解。 思路&#xff1a;先把空格子的位置存下来&#xff0c;然后对每一个空位置挨个枚举1-9。枚…

Excel常用公式总结非常实用

16个最实用的Excel万能公式 1、多条件判断 IF(And(条件1,条件2..条件N),条件成立返回值) IF(or(条件1,条件2..条件N),条件成立返回值) 2、多条件查找 Lookup(1,0/((条件1*条件2*...条件N)),返回值区域&#xff09; 3、多条件求和 Sumifs(值区域,判断区域1,条件1,判断区域2,条…