python功能驅動,無需漂亮的介面,詳解argparser模組的使用
我們知道,在windows、linux、macos這樣一些作業系統中,除了提供一些傻瓜式的使用者介面方便使用者操作外,這些系統很大程度上都留給一些系統愛好者(或深度學習的使用者)一些命令列介面。
cmd和shell
透過一些簡單的系統命令,實現同介面一樣的操作效果,甚至可以實現一些使用者介面無法實現的功能。
01
不同系統的命令列工具
不同系統命令列呼叫方式存在差異。
【Windows系統】
windows系統
對於windows使用者,按下“win” + ‘r’鍵,在彈出對話方塊中輸入cmd,可以進入這樣的互動介面。比如,你想要檢視當前windows系統中所有端口占用情況,可以使用下面的命令:
netstat -ano
命令列演示
如果使用圖形介面,可能獲取到的資訊就沒這麼詳細了!
windows中,如果你想要更加高階的介面,在某個資料夾介面中按下“shift”,同時單擊滑鼠右鍵,同時按下“s”鍵(或者點選“在PowerShell中開啟”這個選項),即可開啟PowerShell視窗,這是一個更加高階的命令列視窗,說它高階,是因為它是一個面向物件的命令列介面。
PowerShell視窗
【linux系統】
linux系統
這裡的linux系統指的是大部分linux系統:
Ctrl + Alt + t:
開啟一個新的終端
Shift +Ctrl + t
:在已有終端上開啟一個新的tab
Shift +Ctrl + n
:在已有終端上開啟另一個新的終端(不是tab)
這裡就不再截圖了,感興趣的小夥伴自己實驗下!
【其它系統】
其他os
此處略去,詳情參見系統手冊^-^
對於這些命令列工具,本質上來講,就是
呼叫系統中存在的一些應用程式,將程式執行結果在終端顯示出來。
而程式執行需要的一些引數,透過命令列的一定格式,傳遞給命令來執行。
命令列解析
比如,上面的“netstat -ano”這個命令。其中,a、n、o就是netstat執行時需要使用者提供的引數,這裡也可以分開來寫,比如:netstat -a -n -o。當用戶將這個命令提交給shell、cmd等終端工具時,shell、cmd就將命令傳送給系統底層(可能這裡還不是系統底層,暫且這樣理解即可)執行,執行後系統將結果會送給shell、cmd等,shell、cmd透過其展示機制,將執行結果展示給使用者。
本質來講是個介面
Python作為一門強大的程式語言,實現這種命令列介面可以說是輕而易舉。我們來看下面的內容:
02
argparse模組介紹
Python實現類似上面這種命令列介面,有一個簡單易用的標準庫,不用匯入任何第三方庫即可輕鬆實現,這裡需要用到argparse模組,它可以讓人輕鬆編寫使用者友好的命令列介面。
我們先來看一個官網的例子:
import argparse
parser = argparse。ArgumentParser(description=‘處理一些整數’)
parser。add_argument(‘integers’, metavar=‘N’, type=int, nargs=‘+’, help=‘累加器的整數’)
parser。add_argument(‘——sum’,dest=‘accumulate’,action=‘store_const’,const=sum,default=max,help=‘對整數求和(預設值:查詢最大值)’)
args = parser。parse_args()
print(args。accumulate(args。integers))
為了便於理解,我們對相關引數說明進行了翻譯。
我們將上述程式碼儲存為“test。py”檔案,在PyCharm中測試執行,看下結果
使用預設-h或——help測試結果
然後我們傳入引數看下執行結果。
powershell中測試結果
從上面看,類似的程式設計步驟應該是這樣的
第一步:匯入模組後,定義一個ArgumentParser物件例項
第二步:使用add_argument(*args, **kwargs)方法,向該物件例項中新增引數
第三步:使用parse_args()方法解析該例項物件中的引數。
03
分步驟實現命令列介面
上面梳理了一般命令列介面程式的設計步驟,程式首先建立類的例項,然後定義它需要的引數,後argparse將弄清如何從 sys。argv 解析出哪些引數。此外,argparse模組還會自動生成幫助和使用手冊,並在使用者給程式傳入無效引數時報出錯誤資訊。
功能
下面,我們逐個攻破上面涉及到的類的例項和相關方法(下文只是針對步驟對類及方法的引數進行了簡要說明,)
【建立解析器物件ArgumentParser】
class argparse。ArgumentParser(prog=None, usage=None, description=None, epilog=None, parents=[], formatter_class=argparse。HelpFormatter, prefix_chars=‘-’, fromfile_prefix_chars=None, argument_default=None, conflict_handler=‘error’, add_help=True, allow_abbrev=True, exit_on_error=True)
建立一個新的 ArgumentParser 物件。所有的引數都應當作為關鍵字引數傳入。每個引數在下面都有它更詳細的描述,
【prog】 - 程式的名稱(預設值:sys。argv[0])
【usage】 - 描述程式用途的字串(預設值:從新增到解析器的引數生成)
【description】 - 在引數幫助文件之前顯示的文字(預設值:無)
【epilog】 - 在引數幫助文件之後顯示的文字(預設值:無)
【parents】 - 一個 ArgumentParser 物件的列表,它們的引數也應包含在內
【formatter_class】 - 用於自定義幫助文件輸出格式的類
【prefix_chars】 - 可選引數的字首字元集合(預設值: ‘-’)
【fromfile_prefix_chars】 - 當需要從檔案中讀取其他引數時,用於標識檔名的字首字元集合(預設值: None)
【argument_default】 - 引數的全域性預設值(預設值: None)
【conflict_handler】 - 解決衝突選項的策略(通常是不必要的)
【add_help】 - 為解析器新增一個 -h/——help 選項(預設值: True)
【allow_abbrev】 - 如果縮寫是無歧義的,則允許縮寫長選項 (預設值:True),該引數從Python3。5開始才有。在Python3。8之前的版本中,該引數還會禁用短旗標分組,例如 -vv 表示為 -v-v。
【exit_on_error】 - 決定當錯誤發生時是否讓 ArgumentParser 附帶錯誤資訊退出。該引數在Python3。9版本中才有 (預設值: True)
對於一般需求的應用程式,直接定義描述資訊即可。但是,當我們需要自定義一些個性化的功能時,這些引數往往就顯得很重要了。如何對這些引數進行個性化定製,每一個引數的含義如何?我們後續專題講解,這裡不再贅述。
類的例項定義好了,如何往例項裡面新增引數資訊?我們接著往下看!
【使用add_argument新增引數】
import argparse
parser = argparse。ArgumentParser(description=“XXXXXXX”)
parser。add_argument(**kwargs)
ArgumentParser。add_argument(name or flags。。。[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])
定義單個的命令列引數應當如何解析。每個形參都在下面有它自己更多的描述,長話短說有:
【name or flags】 - 一個命名或者一個選項字串的列表,例如 foo 或 -f, ——foo。
【action】 - 當引數在命令列中出現時使用的動作基本型別。
【nargs】 - 命令列引數應當消耗的數目。
【const】 - 被一些 action 和 nargs 選擇所需求的常數。
【default】 - 當引數未在命令列中出現並且也不存在於名稱空間物件時所產生的值。
【type】 - 命令列引數應當被轉換成的型別。
【choices】 - 可用的引數的容器。
【required】 - 此命令列選項是否可省略 (僅選項可用)。
【help】 - 一個此選項作用的簡單描述。
【metavar】 - 在使用方法訊息中使用的引數值示例。
【dest】 - 被新增到 parse_args() 所返回物件上的屬性名。
對於
add_argument
方法,我們
下文專題介紹,
這裡不再贅述了。
引數新增後,我們需要完成引數的解析,這裡我們要用到parse_args方法!
【使用parse_args解析引數】
ArgumentParser 透過 parse_args() 方法解析引數。它將檢查命令列,把每個引數轉換為適當的型別然後呼叫相應的操作。在大多數情況下,這意味著一個簡單的 Namespace 物件將從命令列引數中解析出的屬性構建:
【args】 - 要解析的字串列表。 預設值是從 sys。argv 獲取。
【namespace】 - 用於獲取屬性的物件。 預設值是一個新的空 Namespace 物件。
上面的例子中,當我們列印解析出來的args引數時,輸出是這樣的:
Namespace(accumulate=
# 其中,integers列表是我們傳遞的引數值。一般情況下,程式會自動從sys。argv中解析出引數,該方法不需要傳遞引數,是不是很方便?
方便
對於
parse_args方法,它其實提供了很多容錯機制,當用戶輸入內容不合法時,進行相應的處理。我們下文也會專題進行研究。這裡不再贅述。
本文,我們只瞭解下ArgumentParser物件例項的建立、引數新增、引數解析的步驟,對於這裡很重要的幾個類和方法,我們下文逐個進行講解。
下面,針對本文內容,我們利用一個例項加深下印象!
04
舉個例子
我們知道,
預設情況下,
如果我們對幫助資訊不做任何格式限定,它應該是這樣的(以前面官網例子為例):
預設幫助資訊格式
如果我們需要自己定製一個幫助資訊文字,只需要在建立類的例項時,對prog、usage、description、epilog等這樣一些引數進行定製即可。
引數定製
我們看到,這裡使用引數對幫助資訊進行了一些個性化調整。但是,上面內容空行太多,該如何設定去除空行呢?對這個問題,我們下次討論建立
ArgumentParser物件
例項時再做介紹。
好了,今天的內容就到這裡了,喜歡Python的小夥伴關注我,後續內容更加精彩。
本文為作者原創內容,轉載請註明出處,百家號:Python高手養成
想了解更多精彩內容,快來關注python高手養成