Unix系統的一個核心思想是:建立一組小工具,然後通過管道的方式將其組合成大工具。這一思想指導Unix/Linux等成為最為實用的伺服器作業系統。而在編寫Unix/Linux的C/C++程式時,命令列解析器是必不可少的。只有通過命令列參數進行訊息傳遞,才能充分利用管道、Bash指令碼來進行自動化。C++中我最常用的一個命令列解析器是TCLAP。而在Python中,有一個更強大的命令列解析器 ArgParse。
Argparse的使用很簡單,主要有三個步驟:
- 建立解析器對象: parser = argparse.ArgumentParser( prog='PROG' )
- 添加參數: parser.add_argument(....)
- 進行解析: values = parser.parse_args()
Argparse預設是從 sys.argv 中進行解析,但也可以直接解析字串,如
values = parser.parse_args('--foo 1 -x 2 -y 3'.split()),這在調試中很有用。
Argparse的優點主要有:
- 位置參數:可以不用前置引導符來進行參數設定;
- 選擇性參數:可指定哪些參數一定要提供,哪些是可選的;
- 合成協助:只需要在添加參數時給每個參數提供協助說明,程式會自動給出Unix統一命令列協助,其輸出命令為 parser.print_help();
- 可指定參數格式:通過Argparse給定的標識符 nargs,可指定某個引導符後參數的格式,其中N代表N個,?代表0或1個,*代表0或多個,+代表1或多個;
- 子命令列;支援多個子命令列解析器(我認為這個功能不是很實用,畢竟Unix工具的目標是小巧實用);
- 參數類型可定義:這樣可以進行參數類型轉換與檢查,並且可以定義參數調用方式;
- 自訂調用函數:這是一個進階技巧,其可以按照特定的格式編寫一個回調對象類,這樣在進行解析某個參數時,可自動回調這個對象的某個操作。
- 限定範圍:通過choices命令可以限定某個參數的取值範圍;
- 可繼承多個解析器:這個功能很有用,其可以通過多個解析器來產生一個整合的解析器,其可以解析所有的參數;
- 參數隱藏:利用 argparse.SUPPRESS 常量符,可設定某個參數是協助隱藏還是整體隱藏,這樣可以屏蔽一些進階參數設定;
Google Code 上的ArgParse 有很好的協助文檔,並附加一些參考範例,很值得研究學習。