一、說明
在學C語言的時候就知道可以通過argc獲取命令行參數個數,可以通過argv獲取具體參數。但自己寫的程序獲取到的參數一是沒有鍵值形式二是寫的參數不能亂序,和系統命令不太一樣。
再往后點知道有getopt這個東西,但印象中嘗試理解其用法很多次都沒什么結果;最近又越來多寫程序,再次感覺很有必要掌握。
這里以Python3為例演示getopt,python感覺就是C的封裝,C的getopt應該也類似。
二、程序代碼
此程序中設置-h/-n/-p三個選項,-h不帶值-n和-p帶值;三個參數設置等價長格式--help/--name/--profession。
程序通過sys.argv[1:]來獲取所有待解析參數,然后傳到getopt進行解析,更多說明見代碼注釋。
import getopt import sys class GetoptTest: def __init__(self,argv): try: # 第一個參數argv----傳過來的要解析的參數數組。形如['-n', 'ls', '-p', 'programmer'] # 第二個參數"hn:p:"----用於向getopt注冊短格式。沒有:表示該參數不帶值,有:表示下一參數為該參數的值 # 第三個參數[]----用於向getopt注冊長格式。沒有=表示該參數不帶值,有=表示=號后邊為其值(如果沒有=號就以下一個參數為其值) # 第三個參數[]----[]不是可選的意思,這里是代碼,[]表示該參數是個數組 # opts----以元組形式存放解析出的參數。形如[('-n', 'ls'), ('-p', 'programmer'), ('-h', '')] # args----以數組形式存放按所有注冊的格式未能解析參數 opts, args = getopt.getopt(argv, "hn:p:", ["help", "name=", "profession="]) print(f"parsed argv: opts----{opts} args----{args}") except getopt.GetoptError: # 參數不符合注冊格式要求報錯 print("parameter format error") self.usage() sys.exit(2) user_name = "" user_profession = "" # 遍歷所有元組 # getopt只會嚴格按照注冊的格式解析參數,而不理解哪個短格式與哪個長格式等價,等價是我們這里設定短格式和長格式用同一響應造成的 # 也就是說getopt並不理解-n和--name等價,他有-n就解析-n有--name就解析--name,兩個都有就兩個都解析。-n和--name等價是因為我們對這兩個參數用同樣的代碼進行處理。 # 比如執行python getopt_test.py -n ls --name=root,解析出的就是[('-n', 'ls'), ('--name', 'root')] for opt, arg in opts: # -h與--help等價 if opt in ("-h","--help"): self.usage() sys.exit() # -n與--name等價 elif opt in ("-n","--name"): user_name = arg # -p與--profession等價 elif opt in ("-p","--profession"): user_profession = arg print(f"you are {user_profession} {user_name}!") def usage(self): print("getopt_test version 1.0") print("-h print this message") print("-n <your name> equ --name") print("-p <your profession> equ --profession") if __name__ == "__main__": # 系統參數可通過sys.argv[index]來獲取,sys.argv[0]是本身文件名 argv = sys.argv[1:] print(f"will parse argv: {argv}") # sys.argv[index]武斷地以空格來划分參數,並不能區分選項和選項值 # sys.argv[index]不能亂序,取第一個參數為用戶名,就必須在第一個參數輸入用戶名,不能在第二或別的地方輸 # 我們使用getopt模塊來解決這兩個問題 para_test_obj = GetoptTest(argv)
三、運行截圖
下圖中依次以以下四種形式運行程序,觀察getopt解析前后參數可對getopt有更直觀理解
python getopt_test.py -h python getopt_test.py -n ls -p programmer python getopt_test.py -n ls -p programmer --name=lsx python getopt_test.py -n ls -p programmer --name=lsx other1 other2
參考:
http://www.runoob.com/python3/python3-command-line-arguments.html