1. 程式人生 > 程式設計 >python 如何利用argparse解析命令列引數

python 如何利用argparse解析命令列引數

命令列引數工具是我們非常常用的工具,比如當我們做實驗希望調節引數的時候,如果引數都是通過硬編碼寫在程式碼當中的話,我們每次修改引數都需要修改對應的程式碼和邏輯顯然這不太方便。比較好的辦法就是把必要的引數設定成通過命令列傳入的形式,這樣我們只需要在執行的時候修改引數就可以了。

sys.argv

解析命令列傳入引數最簡單的辦法就是通過sys.argv,sys.argv可以獲取到我們通過命令列傳入的引數。

import sys

print(sys.argv)

用法很簡單,只需要呼叫sys.argv即可。argv是一個數組,如果引數有多個,我們可以通過下標進行訪問。但是有一點需要注意,argv當中儲存的結果是從Python呼叫開始的。

我們來看一個例子,我們隨意傳入一些引數,print sys.argv之後是這樣的。

python test.py -a -c -d=222 
>>> ['test.py','-a','-c','-d=222']

也就是說我們python執行test.py這個檔名也當做引數之一,所以我們要獲取自定義引數的話需要從argv[1]開始。

sys.argv的好處是方便,我們只需要訪問它就可以拿到傳入的引數了。但是缺點也很明顯,就是功能太少了。假如我們是看其他大神的程式碼,我們想要知道執行的時候需要傳入什麼引數,以及每個引數代表什麼含義就做不到了。

為了解決這個問題,我們需要使用封裝更多功能的工具,也是本篇文章的核心——argparse。

基本用法

argparse是Python當中的一個庫,我們需要先import一下,這個庫我沒記錯應該是Python自帶的,也不需要安裝,我們直接就可以使用。

在我們使用之前,我們需要先初始化這個parse,也就是一個引數解析器。

# 這裡ArgumentParser可以傳入一個字串,表示用途
parser = argparse.ArgumentParser()
parser.parse_args()

這個時候其實就已經有了一個解析器了,我們在執行的時候可以傳入引數-h,表示help,也就是檢視目前解析器當中定義的引數。由於我們現在什麼也沒有,所以能顯示出來的就只有help。

python 如何利用argparse解析命令列引數

必選引數

首先我們來介紹必選引數,它的定義和函式當中的必填引數是一樣的,也就是說我們執行程式必須要的引數。如果不傳,那麼程式不應該執行會進行報錯並提示。

定義必選引數的方法非常簡單,我們只需要通過add_argument傳入引數的名稱就可以了。

import argparse

parser = argparse.ArgumentParser("For test the parser")
parser.add_argument('test')
args = parser.parse_args()

print(args.test)

這樣我們就定義了一個名叫test的引數,我們可以通過args.test來訪問它。

這個時候我們再執行python test.py -h就會發現提示的資訊當中多了一行:

python 如何利用argparse解析命令列引數

告訴我們必選引數當中有test,必選引數直接傳入,不需要加上字首。所以我們執行的時候直接python test.py xxx就可以了。

可選引數

有必選引數當然就有可選引數,可選引數由於可選可不選, 所以我們在使用的時候需要在引數前加上標識-或者--。比如我們引數名叫做test,可以定義成-test或者--test,這兩種都可以,也可以這兩種都定義。

parser.add_argument('-test','--test')

我們執行-h可以發現optional arguments當中多了test和--test。

python 如何利用argparse解析命令列引數

但是這個只print出來了引數名,並沒有告訴我們這個引數究竟是做什麼的,像是help引數後面就跟了show this help message and exit這個提示語。如果我們也希望help能夠提示我們引數的作用怎麼辦呢?

我們可以通過help引數傳入我們希望打印出來的提示語,這樣方便使用者在使用的時候瞭解引數的情況。

比如我們把這行語句改成:

parser.add_argument('-test','--test',help='just for help')

這樣當我們執行的時候,就會看到提示語了:

python 如何利用argparse解析命令列引數

預設值

如果引數很多的時候,我們有時候可能不希望每一個都指定一個值,而是希望可以在不填的時候有一個預設值。這個想法非常正常,想要做到這點也很簡單,我們可以通過default引數來指定。

import argparse

parser = argparse.ArgumentParser("For test the parser")
parser.add_argument('-test',default=1,help='just for help')
args = parser.parse_args()

print(args.test)

比如這樣我們在程式碼當中把test引數的預設值設定成了1,當我們執行的時候,如果不填test這個引數的話,那麼程式就會使用它的預設值也就是1。

但有一點預設值的資訊並不會print在help當中,所以我們需要自己在提示語當中告知使用者預設值是多少。

type

我們可以定義引數的預設值,當然也可以定義它的型別。

因為命令列傳入的引數預設都是字串,如果我們要進行數學上的計算,使用str還需要自己轉換,這就很不方便。我們可以在傳入引數的時候就完成型別的匹配,這樣如果傳入引數的型別不對, 那麼直接報錯,不往下執行。

想要做到這點也很簡單,通過type引數就可以實現。

parser.add_argument('-test',type=int,help='just for help')

比如當我們定義了一個int型的引數,而傳入的是型別不匹配的話,那麼就會引起報錯:

python 如何利用argparse解析命令列引數

報錯資訊當中寫得很清楚,我們得到了一個無效的int的值,它是abc。

可選值

它同樣還支援可選值,可選值很好理解,就是我們希望限定傳入引數的範圍僅僅在幾個值當中。比如說我們希望傳入的值不是0就是1,或者是在某幾個具體的值當中,這個時候我們可以通過choices引數來實現這一點。

choices引數傳入的是一個list,也就是我們的限定範圍,只有在這個範圍當中的值才被允許。

parser.add_argument('-test',choices=[2,3,4],help='just for help')

如果我們執行傳入test=1,那麼就會引起報錯,告訴我們傳入的值不在choices範圍當中。

python 如何利用argparse解析命令列引數

這是一個挺有意思的例子,仔細看會發現我們預設值設定成了1,但是可選值當中並沒有1。這也是允許的,預設值可以不在可選值範圍內,但是當我們傳入1就會觸發可選值校驗。

action

action是一個很神奇也很有用的操作,可以指定引數的處理方式。我們預設的方式是store,也就是儲存的意思,這個我們都能理解。除此之外,還有store_true,它表示出現則是true,否則是false。

parser.add_argument('-test',action='store_true',help='just for help')

當我們把test引數的定義改成這樣之後,我們來對比一下執行的結果就明白了。

python 如何利用argparse解析命令列引數

除了store_true之外還有store_const,也就是說出現就指定為一個固定值。

parser.add_argument('-test',action='store_const',const=23,help='just for help')

這樣當我們指定-test引數之後,它會自動被賦值成23。

除了這兩個之外,另外一個很常用的引數是append,可以將多次出現的同一個引數自動存入一個list當中。

parser.add_argument('-test',action='append',help='just for help')

python 如何利用argparse解析命令列引數

nargs

nargs也是一個非常有用的引數,可以對引數進行一些花式操作。nargs的傳入引數有以下幾種,首先是N,也就是一個整數。代表可以接收N個引數值,這N個值會被存入一個list當中。

parser.add_argument('-test',nargs=2,help='just for help')

另外一種傳入的引數是'+'或者是'*',它可以將任意多個值存入一個list當中。

parser.add_argument('-test',nargs='*',help='just for help')

python 如何利用argparse解析命令列引數

總結

有了parser之後,我們在Python當中處理命令列引數會變得非常簡單,我們可以做各種各樣的定製化操作。除了我們上面介紹的之外,還有一些其他的做法,相對來說不是非常常用,所以就不一一窮盡了,感興趣的同學可以自行了解一下。

以上就是python 如何利用argparse解析命令列引數的詳細內容,更多關於python 解析命令列的資料請關注我們其它相關文章!