argparse 參數解析


本文來自官方文檔,了解下面這些,基本上就夠了。

argparse 模塊

概念

argparse 是 Python 標准庫中推薦的命令行解析模塊。在 linux 中,我們可以執行帶有參數的命令:

ls -l
rm -rf

上面例子中,-l, -rf 都是可選參數。

python中也可以做到給一個模塊添加可選參數,來進行命令解析。

基礎

prog.py

import argparse
parser = argparse.ArgumentParser()  # 創建解析器對象
parser.parse_args()  # 解析命令

寫了這三行,一個簡單的命令解析就做完了。

盡管我們沒有添加任何參數,它依然自帶了一個 --help-h 的參數。

執行效果:

$ python3 prog.py --help
usage: prog.py [-h]

options:
  -h, --help  show this help message and exit

添加程序描述

import argparse

parser = argparse.ArgumentParser(description="Test ...")  # 添加一個描述
args = parser.parse_args()

查看描述:

>>> python a.py --help
usage: a.py [-h]

Test ...  # 這里能看到描述信息

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

位置參數

可以像是python 函數中的位置參數一樣,我們指定一個位置參數,可以直接給腳本傳遞值,而不用指定參數名稱

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("square", type=int, help="display a square of a given number")

args = parser.parse_args()  # 解析后返回一個對象,它包含了所有的參數
print(args.square)  # 每個參數都是它的屬性

add_argument() 可以添加一個參數,它的 help 可以添加一個參數的提示信息,type 可以指定當前參數的類型(默認類型是字符串)

parser.parse_args() 返回一個包含所有參數的對象,每個參數都是它的屬性。

使用:

$ python3 prog.py 4
4

可以看出,我們直接像位置參數一樣,傳遞個值就行。

可選參數

可選參數,就是加不加都行的參數,類似於 linux 上的 ls -l-l 就是可選的。

import argparse

parser = argparse.ArgumentParser()

parser.add_argument("--verbosity", help="increase output verbosity")  # 使用 `--` 來指明可選項

args = parser.parse_args()
if args.verbosity:
    print("verbosity turned on")

如果用戶沒有添加這一可選參數,相關的變量被賦值為 None

使用方式python prog.py --verbosity 4

短選項

可以給參數設置短選項,譬如默認的 -h 等同於 --help-h 就是一個短選項

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-v", "--verbose", help="increase output verbosity",  # 使用 `-` 來指明短選項
                    action="store_true")
args = parser.parse_args()
if args.verbose:
    print("verbosity turned on")

使用:

python3 prog.py -v

互斥選項

互斥選項,就是說兩個選項互斥,用戶只能使用其中一個。

import argparse

parser = argparse.ArgumentParser()

# 互斥分組
group = parser.add_mutually_exclusive_group()
# 分組中添加參數
group.add_argument("-v", "--verbose", action="store_true")
group.add_argument("-q", "--quiet", action="store_true")

# 正常的參數
parser.add_argument("x", type=int, help="the base")
args = parser.parse_args()

if args.quiet:
    print('quiet is true')
elif args.verbose:
    print('verbose is true')

使用:

>>> python a.py -v 2  # 單獨某個互斥選項,搭配位置參數
verbose is true

>>> python a.py -q 2
quiet is true

>>> python a.py -q -v 2  # 兩個互斥選項不能一起使用。
usage: a.py [-h] [-v | -q] x
a.py: error: argument -v/--verbose: not allowed with argument -q/--quiet

parse_args()

parse_args 也可以接受參數,它接收的是命令行參數列表。它的默認參數是 sys.argv[1:] 也就是用戶執行腳本時附帶的參數們。但其實我們也可以手動給它傳遞參數,列表的每個元素都是用戶應該輸入的參數:

test.py

import argparse
import sys

parser = argparse.ArgumentParser()
parser.add_argument("p", type=int, help="display a square of a given number")
parser.add_argument("-s", type=int)
parser.add_argument("-d", type=int, nargs=2)

args = parser.parse_args(["1", '-d', "2", "3", '-s', "4"])  # 等同於以腳本執行: python x.py 1 -d 2 3 -s 4
print(args)
print(sys.argv[1:])

我們在命令行中執行:

>>> python a.py 1 -d 2 3 -s 4
Namespace(p=1, s=4, d=[2, 3])
['1', '-d', '2', '3', '-s', '4']

add_argument 的常用參數

const 參數

const 參數用來保存一個常數。需要搭配 action 參數使用,當用戶輸入值時,系統不會保存用戶輸入的值,而是使用當前 const 的值。

action 參數

action="store"

這是動作的默認參數,也就是存儲用戶輸入的值。

action="store_true"

store_true 可以讓一個選項不接受賦值。如果用戶在命令行使用了這個選項,就會將此選項值設置成 True,否則 False。

import argparse
parser = argparse.ArgumentParser()

parser.add_argument("--verbose", help="increase output verbosity", action="store_true"),

args = parser.parse_args()

if args.verbose:
    print("verbosity turned on")

add_argument()action 參數可以指定存放的動作

action="store_true" 意味着:當用戶在命令行使用這個選項時,args.verbose=True,否則為 False。並且這個參數不能設置值,否則會報錯

使用示例:

$ python3 prog.py --verbose    # 僅僅使用這個選項,沒賦值
verbosity turned on
$ python3 prog.py --verbose 1  # 賦值會報錯
usage: prog.py [-h] [--verbose]
prog.py: error: unrecognized arguments: 1

action="store_false"

同 store_true.

action="count"

可以統計某個參數出現的次數。同樣的,當前參數不接受賦值,僅僅統計當前參數的使用次數。

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-v", "--verbosity", action="count",
                    help="increase output verbosity")
args = parser.parse_args()
print(args.verbosity)

使用:

>>> python a.py -v -v  # 使用了2次
2
>>> python a.py -vvv
3

>>> python a.py -v 2  # 不接受賦值
usage: a.py [-h] [-v]
a.py: error: unrecognized arguments: 2

action="store_const"

存儲被 const 命名參數指定的值

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='store_const', const=42)
>>> parser.parse_args(['--foo'])
Namespace(foo=42)

當用戶使用了這個參數 --foo,會將 const 存放的值,作為參數的值。

action='append'

將當前參數的值,添加到當前參數的列表中

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])

action='append_const'

將 const 指定的值,添加到列表(注意 const 命名參數默認為 None)

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--str', dest='types', action='append_const', const=str)
>>> parser.add_argument('--int', dest='types', action='append_const', const=int)
>>> parser.parse_args('--str --int'.split())
Namespace(types=[<class 'str'>, <class 'int'>])

action='version'

打印版本信息

>>> import argparse
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('--version', action='version', version='%(prog)s 2.0')
>>> parser.parse_args(['--version'])
PROG 2.0

action='extend'

這會倉儲一個列表,將每個參數添加到列表中

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument("--foo", action="extend", nargs="+", type=str)
>>> parser.parse_args(["--foo", "f1", "--foo", "f2", "f3", "f4"])
Namespace(foo=['f1', 'f2', 'f3', 'f4'])

nargs 參數

這個參數,可以指定一個參數后面可以跟隨幾個值。

譬如:python xxx.py -v 1 2 3 這句代碼中, -v 參數后面跟了3個值:1 2 3,這三個值都屬於 -v ,我們就可以通過 nargs 定義一個參數后面可以跟隨幾個值。

nargs 的幾種參數類型:

  • num: num 是一個整數,它會將命令行中的 num 個參數放到一個列表中。

  • ?: 一個參數可以跟隨值,也可以不跟隨值(默認 default)

  • *: 一個參數后面可以跟隨任意多的值,會放到列表

  • +: 一個參數后面必須跟隨最少一個值,會放到列表

示例一:

import argparse

parser = argparse.ArgumentParser(description="Test ...")
parser.add_argument('-v', '--verbose', nargs='?', default=0)
args = parser.parse_args()
print(args.verbose)
PS C:\Users\UNCO9CA\Desktop> python a.py -v  # 沒跟隨值,None
None
PS C:\Users\UNCO9CA\Desktop> python a.py     # 沒加參數,默認 default
0
PS C:\Users\UNCO9CA\Desktop> python a.py -v 2
2

示例二:

import argparse

parser = argparse.ArgumentParser(description="Test ...")
parser.add_argument('-v', '--verbose', nargs='*', default=0)

parser.add_argument('x')  # 位置參數
args = parser.parse_args()
print(args.verbose)
PS C:\Users\UNCO9CA\Desktop> python a.py 2 -v 1 2 3 4   # 可以將位置參數放到前面,然后后面所有的值都屬於 -v 
['1', '2', '3', '4']

type 參數

type 參數可以將用戶輸入的內容,做類型轉換

import argparse
import pathlib

parser = argparse.ArgumentParser()
parser.add_argument('count', type=int)
parser.add_argument('distance', type=float)
parser.add_argument('street', type=ascii)
parser.add_argument('code_point', type=ord)
parser.add_argument('source_file', type=open)
parser.add_argument('dest_file', type=argparse.FileType('w', encoding='latin-1'))
parser.add_argument('datapath', type=pathlib.Path)

文件操作示例:

import argparse

parser = argparse.ArgumentParser(description="Test ...")
parser.add_argument('file', type=argparse.FileType('w', encoding='utf-8'))
args = parser.parse_args()

args.file.write('hello world')
python a.py './a.txt'   # 會創建一個文件,然后寫入內容

required 參數

required=True 可以指定一個參數為必填參數。

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', required=True)
>>> parser.parse_args(['--foo', 'BAR'])
Namespace(foo='BAR')

>>> parser.parse_args([])
usage: [-h] --foo FOO
: error: the following arguments are required: --foo

choices 參數

choices 選項,可以讓限制用戶的輸入,讓用戶只能輸入 choice 的內容之一,如果輸入別的內容,會報錯。

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-v", "--verbosity", type=int, choices=[0, 1, 2],
                    help="increase output verbosity")

args = parser.parse_args()

default 參數

default 可以設置一個參數的默認值(不設置的話,如果用戶不加此參數,此參數值默認是 None)

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-v", "--verbosity", action="count", default=0)
args = parser.parse_args()

dest 參數

我們上面都是這么用的:

parser.add_argument("-v", "--verbosity", type=int, choices=[0, 1, 2],
                    help="increase output verbosity")

args = parser.parse_args()
print(args.verbosity)  # 注意這里:verbosity 是 args 對象的屬性

args 對象的默認屬性名稱:

  • 如果是位置參數,直接使用位置參數的字符串作為屬性名

  • 如果是可選參數,通常把 長選項 的 -- 除掉后的字符串,作為屬性名: '--verbosity' -> 'verbosity' ; 如果沒有長選項,只有短選項,則把短選項前面的 - 去掉作為屬性名。

但是我們還可以通過 dest 參數,手動設定屬性名(只能給可選參數手動設置)

import argparse

parser = argparse.ArgumentParser(description="Test ...")
parser.add_argument('-x', dest='my_x')
args = parser.parse_args()

print(args.my_x)
>>> python a.py -x 12
12

metavar

當使用 python xx.py --help 時,僅僅改變參數的顯示名字,不改變參數的調用方式

原因:

import argparse

parser = argparse.ArgumentParser(description="Test ...")
parser.add_argument('-x', dest='my_x')  # 這里 dest 是小寫的 `my_x`
args = parser.parse_args()

print(args.my_x)
PS C:\Users\UNCO9CA\Desktop> python a.py -h
usage: a.py [-h] [-x MY_X]

Test ...

optional arguments:
-h, --help  show this help message and exit
-x MY_X      # 這里是大寫的 `MY_X`

可以看出,我們定義的屬性名:my_x 是小寫的,並且調用時也是使用的小寫:args.my_x

但是使用 -h 顯示信息時,是大寫的 MY_X,這和實際情況不一致,因此我們需要修改一下 -h 時顯示的幫助信息

改變后:

import argparse

parser = argparse.ArgumentParser(description="Test ...")
parser.add_argument('-x', dest='my_x', metavar='my_x')  # 添加 metavar
args = parser.parse_args()

print(args.my_x)
PS C:\Users\UNCO9CA\Desktop> python a.py -h
usage: a.py [-h] [-x my_x]

Test ...

optional arguments:
-h, --help  show this help message and exit
-x my_x   # 小寫了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM