本文來自官方文檔,了解下面這些,基本上就夠了。
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 # 小寫了