自定義 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.pswp.cn/news/713011.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/713011.shtml
英文地址,請注明出處:http://en.pswp.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,條…