Python3 getopt解析命令列引數

2021-09-07 20:11:12 字數 2778 閱讀 9827

在學c語言的時候就知道可以通過argc獲取命令列引數個數,可以通過ar**獲取具體引數。但自己寫的程式獲取到的引數一是沒有鍵值形式二是寫的引數不能亂序,和系統命令不太一樣。

再往後點知道有getopt這個東西,但印象中嘗試理解其用法很多次都沒什麼結果;最近又越來多寫程式,再次感覺很有必要掌握。

這裡以python3為例演示getopt,python感覺就是c的封裝,c的getopt應該也類似。

此程式中設定-h/-n/-p三個選項,-h不帶值-n和-p帶值;三個引數設定等價長格式--help/--name/--profession。

程式通過sys.ar**[1:]來獲取所有待解析引數,然後傳到getopt進行解析,更多說明見**注釋。

import

getopt

import

sysclass

getopttest:

def__init__

(self,ar**):

try:

#第乙個引數ar**----傳過來的要解析的引數陣列。形如['-n', 'ls', '-p', 'programmer']##

第三個引數----用於向getopt註冊長格式。沒有=表示該引數不帶值,有=表示=號後邊為其值(如果沒有=號就以下乙個引數為其值)

#第三個引數----不是可選的意思,這裡是**,表示該引數是個陣列

#opts----以元組形式存放解析出的引數。形如[('-n', 'ls'), ('-p', 'programmer'), ('-h', '')]

#args----以陣列形式存放按所有註冊的格式未能解析引數

opts, args = getopt.getopt(ar**, "

hn:p:

", ["

help

", "

name=

", "

profession="])

print(f"

parsed ar**: opts---- 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 !")

defusage(self):

print("

getopt_test version 1.0")

print("

-h print this message")

print("

-n equ --name")

print("

-p equ --profession")

if__name__ == "

__main__":

#系統引數可通過sys.ar**[index]來獲取,sys.ar**[0]是本身檔名

ar** = sys.ar**[1:]

print(f"

will parse ar**: ")

#sys.ar**[index]武斷地以空格來劃分引數,並不能區分選項和選項值

#sys.ar**[index]不能亂序,取第乙個引數為使用者名稱,就必須在第乙個引數輸入使用者名稱,不能在第二或別的地方輸

#我們使用getopt模組來解決這兩個問題

para_test_obj = getopttest(ar**)

下圖中依次以以下四種形式執行程式,觀察getopt解析前後引數可對getopt有更直觀理解

參考:

python 解析引數getopt

如果python想要去解析命令列的引數可以import getopt實現,該模組支援短選項和長選項兩種格式 短選項格式為 加上單個字母選項 長選項為 加上乙個單詞。opts,args getopt.getopt sys.ar 1 hi o s e input output symble oddeve...

getopt 解析命令選項及引數

形式 int getopt argc,argv,引數列表 int getopt int argc,char const argv,const char optstring 呼叫一次,返回乙個選項。在命令列選項引數再也檢查不到optstring 中包含的選項時,返回 1,同時optind儲存第乙個不包...

getopt函式,命令列解析

getopt函式 函式功能 用來解析命令列引數,引數argc和ar 分別代表引數個數和內容,跟main 函式裡的命令列引數一樣 函式所在標頭檔案 include 函式原型定義 int getopt int argc,char const ar const char optstring 引數optst...