1. 程式人生 > 實用技巧 >argparse模組用法例項

argparse模組用法例項

argsparse是python的命令列解析的標準模組,內置於python,不需要安裝。這個庫可以讓我們直接在命令列中就可以向程式中傳入引數並讓程式執行。

我們先在桌面新建“arg學習”的資料夾,在該資料夾中新建demo.py檔案,來看一個最簡單的argsparse庫的使用的例子。

import argparse

parser = argparse.ArgumentParser(description='命令列中傳入一個數字')
#type是要傳入的引數的資料型別  help是該引數的提示資訊
parser.add_argument('integers', type=str, help='傳入的數字')

args = parser.parse_args()

#獲得傳入的引數
print(args)

在這個程式碼中,我們在命令列傳入一個數字。使用方法是開啟命令列,先將工作目錄cd到arg學習

cd desktop/arg學習

然後再命令列中輸入python demo.py -h或者python demo.py --help, 這裡我輸入的是

python demo.py -h

在命令列中看到demo.py的執行結果如下

usage: demo.py [-h] integers

命令列中傳入數字

positional arguments:
  integers    傳入的數字

optional arguments:
  -h, --help  show this help message and exit

現在我們在命令列中給demo.py 傳入一個引數5,

python demo.py 5

執行,得到的執行結果是

Namespace(integers='5')

操作args字典

其實得到的這個結果Namespace(integers='5')是一種類似於python字典的資料型別。

我們可以使用arg.引數名來提取這個引數

import argparse

parser = argparse.ArgumentParser(description='命令列中傳入一個數字')
#type是要傳入的引數的資料型別  help是該引數的提示資訊
parser.add_argument('integers', type=str, help='傳入的數字')

args = parser.parse_args()

#獲得integers引數
print(args.integers)

在命令列中執行python demo.py 5, 執行結果為

5

傳入多個引數

現在在命令列中給demo.py 傳入多個引數,例如傳入1,2,3,4四個數字

python demo.py 1 2 3 4

執行報錯

usage: demo.py [-h] integers 
demo.py: error: unrecognized arguments: 2 3 4

不能識別2 3 4,看原始碼我們知道integers這個引數是位置引數,說明第一個數1是能識別。這裡我們需要重新更改demo.py程式碼

import argparse

parser = argparse.ArgumentParser(description='命令列中傳入一個數字')
parser.add_argument('integers', type=str, nargs='+',help='傳入的數字')
args = parser.parse_args()

print(args.integers)

nargs是用來說明傳入的引數個數,'+' 表示傳入至少一個引數。這時候再重新在命令列中執行python demo.py 1 2 3 4得到

['1', '2', '3', '4']

改變資料型別

add_argument中有type引數可以設定傳入引數的資料型別。我們看到程式碼中有type這個關鍵詞,該關鍵詞可以傳入list, str, tuple, set, dict等。例如我們把上面的type=str,改成type=int,這時候我們就可以進行四則運算。

import argparse

parser = argparse.ArgumentParser(description='命令列中傳入一個數字')
parser.add_argument('integers', type=int, nargs='+',help='傳入的數字')
args = parser.parse_args()

#對傳入的資料進行加總
print(sum(args.integers)

在命令列中輸入python demo.py 1 2 3 4, 執行結果為

10

位置引數

在命令列中傳入引數時候,傳入的引數的先後順序不同,執行結果往往會不同,這是因為採用了位置引數,例如

import argparse

parser = argparse.ArgumentParser(description='姓名')
parser.add_argument('param1', type=str,help='姓')
parser.add_argument('param2', type=str,help='名')
args = parser.parse_args()

#列印姓名
print(args.param1+args.param2)

在命令列中分別輸入python demo.py 張 三python demo.py 三 張,得到的 執行結果分別為

張三

三張

如果我們將程式碼parser.add_argument('param1', type=str,help='姓')

parser.add_argument('param2', type=str,help='名')互換位置,即第4行和第五行程式碼,再重新執行

python demo.py 張 三python demo.py 三 張,得到的 執行結果分別為

三張

張三

可選引數

為了在命令列中避免上述位置引數的bug(容易忘了順序),可以使用可選引數,這個有點像關鍵詞傳參,但是需要在關鍵詞前面加--,例如

import argparse

parser = argparse.ArgumentParser(description='姓名')
parser.add_argument('--family', type=str,help='姓')
parser.add_argument('--name', type=str,help='名')
args = parser.parse_args()

#列印姓名
print(args.family+args.name)

在命令列中輸入

python demo.py --family=張 --name=三

執行結果

張三

可選引數雖然寫法比較繁瑣,但是增加了命令列中的可讀性,不容易因為引數傳入順序導致資料錯亂。

預設值

add_argument中有一個default引數。有的時候需要對某個引數設定預設值,即如果命令列中沒有傳入該引數的值,程式使用預設值。如果命令列傳入該引數,則程式使用傳入的值。具體請看下面的例子

import argparse

parser = argparse.ArgumentParser(description='姓名')
parser.add_argument('--family', type=str, default='張',help='姓')
parser.add_argument('--name', type=str, default='三', help='名')
args = parser.parse_args()

#列印姓名
print(args.family+args.name)

在命令列中分別輸入python demo.pypython demo.py --family=李

執行結果分別為

張三

李三

必需引數

add_argument有一個required引數可以設定該引數是否必需。

import argparse

parser = argparse.ArgumentParser(description='姓名')
parser.add_argument('--family', type=str, help='姓')
parser.add_argument('--name', type=str, required=True, default='', help='名')
args = parser.parse_args()

#列印姓名
print(args.family+args.name)

在命令列中輸入python demo.py --family=張,執行結果

usage: demo.py [-h] [--family FAMILY] --name NAME
demo.py: error: the following arguments are required: --name

因為可選引數name的required=True,所以必須要傳入。如果我們將其更改為False,程式執行結果