首頁 > 軟體

python中parser.add_argument()用法範例(命令列選項、引數和子命令解析器)

2022-03-29 13:01:40

一、argparse介紹

官方檔案

argparse 模組是 Python 內建的一個用於命令項選項與引數解析的模組,argparse 模組可以讓人輕鬆編寫使用者友好的命令列介面。通過在程式中定義好我們需要的引數,然後 argparse 將會從 sys.argv 解析出這些引數。argparse 模組還會自動生成幫助和使用手冊,並在使用者給程式傳入無效引數時報出錯誤資訊。

二、argparse使用——程式碼範例

一個簡單的範例。

import argparse

parser = argparse.ArgumentParser(description='test')

parser.add_argument('--sparse', action='store_true', default=False, help='GAT with sparse version or not.')
parser.add_argument('--seed', type=int, default=72, help='Random seed.')
parser.add_argument('--epochs', type=int, default=10000, help='Number of epochs to train.')

args = parser.parse_args()
print(args.sparse)
print(args.seed)
print(args.epochs)

三個步驟:

1、建立一個解析器——建立 ArgumentParser() 物件

2、新增引數——呼叫 add_argument() 方法新增引數

3、解析引數——使用 parse_args() 解析新增的引數

1、建立一個解析器——建立 ArgumentParser() 物件

使用 argparse 的第一步是建立一個 ArgumentParser 物件:

parser = argparse.ArgumentParser(description='test')

ArgumentParser 物件包含將命令列解析成 Python 資料型別所需的全部資訊。

描述description

大多數對 ArgumentParser 構造方法的呼叫都會使用 description= 關鍵字引數。這個引數簡要描述這個程度做什麼以及怎麼做。在幫助訊息中,這個描述會顯示在命令列用法字串和各種引數的幫助訊息之間。

2、新增引數——呼叫 add_argument() 方法新增引數

給一個 ArgumentParser 新增程式引數資訊是通過呼叫 add_argument() 方法完成的。通常,這些呼叫指定 ArgumentParser 如何獲取命令列字串並將其轉換為物件。這些資訊在 parse_args() 呼叫時被儲存和使用。例如

parser.add_argument('--sparse', action='store_true', default=False, help='GAT with sparse version or not.')
parser.add_argument('--seed', type=int, default=72, help='Random seed.')
parser.add_argument('--epochs', type=int, default=10000, help='Number of epochs to train.')

add_argument() 方法定義如何解析命令列引數

ArgumentParser.add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])

每個引數解釋如下:

  • name or flags - 選項字串的名字或者列表,例如 foo 或者 -f, --foo。
  • action - 命令列遇到引數時的動作,預設值是 store。
  • store_const,表示賦值為const;
  • append,將遇到的值儲存成列表,也就是如果引數重複則會儲存多個值;
  • append_const,將引數規範中定義的一個值儲存到一個列表;
  • count,儲存遇到的次數;此外,也可以繼承 argparse.Action 自定義引數解析;
  • nargs - 應該讀取的命令列引數個數,可以是具體的數位,或者是?號,當不指定值時對於 Positional argument 使用 default,對於 Optional argument 使用 const;或者是 * 號,表示 0 或多個引數;或者是 + 號表示 1 或多個引數。
  • const - action 和 nargs 所需要的常數值。
  • default - 不指定引數時的預設值。
  • type - 命令列引數應該被轉換成的型別。
  • choices - 引數可允許的值的一個容器。
  • required - 可選引數是否可以省略 (僅針對可選引數)。
  • help - 引數的幫助資訊,當指定為 argparse.SUPPRESS 時表示不顯示該引數的幫助資訊.
  • metavar - 在 usage 說明中的引數名稱,對於必選引數預設就是引數名稱,對於可選引數預設是全大寫的引數名稱.
  • dest - 解析後的引數名稱,預設情況下,對於可選引數選取最長的名稱,中劃線轉換為下劃線.

3、解析引數——使用 parse_args() 解析新增的引數

ArgumentParser 通過 parse_args() 方法解析引數。它將檢查命令列,把每個引數轉換為適當的型別然後呼叫相應的操作。在大多數情況下,這意味著一個簡單的 Namespace 物件將從命令列解析出的屬性構建:

args = parser.parse_args()

在指令碼中,通常 parse_args() 會被不帶引數呼叫,而 ArgumentParser 將自動從 sys.argv 中確定命令列引數。

三、結果測試

import argparse

parser = argparse.ArgumentParser(description='test')

parser.add_argument('--sparse', action='store_true', default=False, help='GAT with sparse version or not.')
parser.add_argument('--seed', type=int, default=72, help='Random seed.')
parser.add_argument('--epochs', type=int, default=10000, help='Number of epochs to train.')

args = parser.parse_args()

print(args.sparse)
print(args.seed)
print(args.epochs)

顯示幫助檔案:

輸錯命令會告訴你usage用法:

使用命令修改引數:

action='store_true’的使用說明

action·- 命令列遇到引數時的動作,預設值是 store。

直接執行python test.py,輸出結果False

執行python test.py --sparse,輸出結果True

也就是說,action=‘store_true’,只要執行時該變數有傳參就將該變數設為True。

四、python args parse_args() 報錯解決

1、error: the following arguments are required: xxx

報錯:

usage: test.py [-h] xxx
test.py: error: the following arguments are required: xxx

原因:

  • args分為可選引數(用--指定)和必選引數(不加--指定)。
  • 如果你定義引數xxx時,沒有用--指定,那麼該引數為需要在命令列內手動指定。此時即使通過default設定預設引數,也還是會報錯。

五、其他問題彙總(評論小夥伴問的)

1、下劃線_和橫線-的區別

Q1:請問博主,第一個位置引數假如說是--max_episode_len,然後也有人寫是--max-episode-len,但是他在呼叫的時候仍然用的是args.max_episode_len,也沒報錯,請問這個下劃線_-的區別在哪裡呢?

A1:沒啥區別,在這裡表示同一個意思,-對應_,程式碼裡寫的不一樣或者都改成一樣的都可以

2、debug怎麼進行?

Q2:這種執行是不是脫離ide,那debug怎麼進行啊?

A2:有linux下,命令列單點偵錯的方法,python -m pdb test.py,搜一搜,網上挺多

總結

到此這篇關於python中parser.add_argument()用法的文章就介紹到這了,更多相關python parser.add_argument()用法內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com