Python命令行工具argparse模塊學(xué)習(xí)筆記

argparse模塊是在命令行(windows的cmd窗口,Linux的shell)執(zhí)行程序時(shí),直接在命令行添加程序執(zhí)行所需參數(shù)的便捷工具。

使用步驟:
(1) import argparse # 導(dǎo)入模塊
(2) parser = argparse.ArgumentParser() # 創(chuàng)建一個(gè)解析對(duì)象
(3) parser.add_argument() # 向該對(duì)象中添加命令行參數(shù)和選項(xiàng)
(4) args = parser.parse_args() # 進(jìn)行解析

解析后的參數(shù)可使用'args.參數(shù)名'的形式進(jìn)行取用,如:cfg.GPU = args.gpu

先舉一個(gè)實(shí)際例子體會(huì)用法,再展開進(jìn)行講解:

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('-w', '--weights', default="YOLO_small.ckpt", type=str)
    parser.add_argument('--data_dir', default="data", type=str)
    parser.add_argument('--threshold', default=0.2, type=float)
    parser.add_argument('--iou_threshold', default=0.5, type=float)
    parser.add_argument('--gpu', default='', type=str)
    args = parser.parse_args()

    if args.gpu is not None:
        cfg.GPU = args.gpu

    if args.data_dir != cfg.DATA_PATH:
        update_config_paths(args.data_dir, args.weights)

    os.environ['CUDA_VISIBLE_DEVICES'] = cfg.GPU

    yolo = YOLONet()
    pascal = pascal_voc('train')

    solver = Solver(yolo, pascal)

    print('Start training ...')
    solver.train()
    print('Done training.')


if __name__ == '__main__':

    # python train.py --weights YOLO_small.ckpt --gpu 0
    main()

以上是一個(gè)YOLO v1的例子,大體可知該模塊的最常用法,下面講解每個(gè)函數(shù)的不同用法。

1. parser = argparse.ArgumentParser()語句常用參數(shù)

argparse.ArgumentParser()方法有很多參數(shù),主要用于命令行執(zhí)行程序時(shí),對(duì)該程序所需參數(shù)選項(xiàng)的說明和修飾。正如前面的例子中一樣,很多時(shí)候不設(shè)置任何參數(shù)即可完成操作,如需對(duì)程序使用者進(jìn)行提示程序運(yùn)行方法和各參數(shù)選項(xiàng)的設(shè)置方法以及更多修飾和說明,使程序使用者更容易運(yùn)行程序,則最好設(shè)置其中參數(shù)。其最常用的幾個(gè)參數(shù)如下:

prog=None,     # 程序名
usage=None,     # 描述程序用法的字符串
description=None,     # -h或--help時(shí)顯示的描述性字符串內(nèi)容,最常用
epilog=None,     # -h/--help時(shí)顯示的結(jié)尾文字
prefix_chars='-',     # 可選參數(shù)的前綴字符集(默認(rèn):‘-‘)
fromfile_prefix_chars=None,     # 命令行參數(shù)從文件中讀取
conflict_handler='error',     #定義兩個(gè)add_argument中添加的選項(xiàng)名字發(fā)生沖突時(shí)怎么處理,默認(rèn)處理是拋出異常
add_help=True     # 是否增加-h/--help選項(xiàng),默認(rèn)是True

上述參數(shù)中一般只使用description給別人描述自己程序是用來干嘛的就行了,其它都不常用。

parser = argparse.ArgumentParser(description='可以這樣使用')
parser.description='也可以這樣使用'
2. parser.add_argument()用法

這個(gè)語句其實(shí)才是用法中最最最重要的語句。其參數(shù)如下:

ArgumentParser.add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices]
[, required][, help][, metavar][, dest])
定義應(yīng)該如何解析一個(gè)命令行參數(shù)。下面每個(gè)參數(shù)有它們自己詳細(xì)的描述,簡(jiǎn)單地講它們是:

name or flags - 選項(xiàng)字符串的名字或者列表,例如foo 或者-f, --foo。
action - 在命令行遇到該參數(shù)時(shí)采取的基本動(dòng)作類型。
nargs - 應(yīng)該讀取的命令行參數(shù)數(shù)目。
const - 某些action和nargs選項(xiàng)要求的常數(shù)值。
default - 如果命令行中沒有出現(xiàn)該參數(shù)時(shí)的默認(rèn)值。
type - 命令行參數(shù)應(yīng)該被轉(zhuǎn)換成的類型。
choices - 參數(shù)可允許的值的一個(gè)容器。
required - 該命令行選項(xiàng)是否可以省略(只針對(duì)可選參數(shù))。
help - 參數(shù)的簡(jiǎn)短描述。
metavar - 參數(shù)在幫助信息中的名字。
dest - 給parse_args()返回的對(duì)象要添加的屬性名稱。

以下內(nèi)容借鑒這篇博文,寫得非常詳細(xì),在此寫下以防遺忘。

(1) name or flags

add_argument()方法必須的參數(shù),且位于第一個(gè)位置,判斷參數(shù)是可變參數(shù),還是位置參數(shù),格式要求:

parser.add_argument('--foo','-f')  #這種形式表示可變參數(shù),前綴可根據(jù)parse.ArgumentParser()里面的prefix_char參數(shù)來定義
parser.add_argument('foo')  #這種形式表示位置參數(shù)
(2) help

自定義add_argument()中參數(shù)的幫助信息

# help_example.py
import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--foo',help="this is mystyle help")
parser.parse_args()

顯示:
xxx$ ./help_example.py -h
usage: help_example.py [-h] [--foo FOO]

optional arguments:
  -h, --help  show this help message and exit
  --foo FOO   this is mystyle help
(3) type

默認(rèn)情況下對(duì)于命令行參數(shù)是直接解析成字符串類型,type可以指定參數(shù)類型為其它

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('foo', type=int) #指定參數(shù)類型為整型
>>> parser.add_argument('bar', type=open) #指定對(duì)于參數(shù)進(jìn)行open操作
>>> parser.parse_args('2 temp.txt'.split())
Namespace(bar=<_io.TextIOWrapper name='temp.txt' encoding='UTF-8'>, foo=2)
(4) choices

用于界定參數(shù)的取值范圍

>>> parser = argparse.ArgumentParser(prog='doors.py')
>>> parser.add_argument('door', type=int, choices=range(1, 4))
>>> print(parser.parse_args(['3']))
Namespace(door=3)
>>> parser.parse_args(['4'])
usage: doors.py [-h] {1,2,3}
doors.py: error: argument door: invalid choice: 4 (choose from 1, 2, 3)
(5) dest

使用parse_args()對(duì)參數(shù)進(jìn)行解析后,一個(gè)屬性對(duì)應(yīng)一個(gè)參數(shù)的值,而該屬性值正是dest的值,默認(rèn)情況下,對(duì)于位置參數(shù),就是位置參數(shù)的值,對(duì)于可選參數(shù),則是去掉前綴后的值

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('bar')
_StoreAction(option_strings=[], dest='bar', nargs=None, const=None, default=None, type=None, choices=None, help=None, metavar=None)
>>> parser.add_argument('--version')
_StoreAction(option_strings=['--version'], dest='version', nargs=None, const=None, default=None, type=None, choices=None, help=None, metavar=None)

即在默認(rèn)情況下,args.bar即代表命令行指定bar的值,args.version即表示在命令行指定的--version的值。

(6) nargs

一般情況下,一個(gè)參數(shù)與一個(gè)操作參數(shù)(如:--version)關(guān)聯(lián),但nargs可以將多個(gè)參數(shù)與一個(gè)操作參數(shù)關(guān)聯(lián)

  • N——一個(gè)正整數(shù)
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', nargs=2)
>>> parser.add_argument('bar', nargs=1)
>>> parser.parse_args('c --foo a b'.split())
Namespace(bar=['c'], foo=['a', 'b'])
  • '?'——一個(gè)或多個(gè)參數(shù)
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', nargs='?', const='c', default='d')
>>> parser.add_argument('bar', nargs='?', default='d')
>>> parser.parse_args(['XX', '--foo', 'YY'])
Namespace(bar='XX', foo='YY')
>>> parser.parse_args(['XX', '--foo'])
Namespace(bar='XX', foo='c')
>>> parser.parse_args([])
Namespace(bar='d', foo='d')
(7) required

用來設(shè)置必選參數(shù),設(shè)定后在命令行不使用會(huì)報(bào)錯(cuò)

>>> parser.add_argument('--foo',required=True)
>>> parser.add_argument('--version 21'.split)
>>> parser.parse_args('--version 21'.split())
usage: [-h] --foo FOO [--version VERSION]
: error: the following arguments are required: --foo
(8) default

設(shè)置參數(shù)的默認(rèn)值,命令行有則覆蓋默認(rèn)值,沒有則使用默認(rèn)值
用法見前述例子。

(9) const

官方給出的解釋是:

The const argument of add_argument() is used to hold constant values that are not read from the command line but are required for the various ArgumentParser actions. The two most common uses of it are:
When add_argument() is called with action='store_const' or action='append_const'. These actions add the const value to one of the attributes of the object returned by parse_args(). See the action description for examples.
When add_argument() is called with option strings (like -f or --foo) and nargs='?'. This creates an optional argument that can be followed by zero or one command-line arguments. When parsing the command line, if the option string is encountered with no command-line argument following it, the value of const will be assumed instead. See the nargs description for examples.
With the 'store_const' and 'append_const' actions, the const keyword argument must be given. For other actions, it defaults to None.

  • 是針對(duì)于action中的'store_const'與'append_const'而出現(xiàn)。其實(shí)對(duì)于那些需要接值的參數(shù),預(yù)先存儲(chǔ)一個(gè)值,如果沒有則取用這個(gè)值,比如
 >>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo',action='store_const',const=42)
>>> parser.add_argument('--bar',action='append_const',const='hello')
>>> parser.parse_args('--foo --bar'.split())
Namespace(bar=['hello'], foo=42)
(10) action

用來給ArgumenParser對(duì)象判斷如何處理命令行參數(shù),支持的操作如下:

  • 'store' - 默認(rèn)的操作,用來存儲(chǔ)參數(shù)的值
>>>parser = argparse.ArgumentParser()
>>>parser.add_argument('--foo')
>>>parser.parse_args('--foo 1'.split)
Namespace(foo='1')   
  • 'store_const' - 適用于可選參數(shù)optional arguments,用來存儲(chǔ)const關(guān)鍵字指定的值
>>>parser = argparse.ArgumentParser()
>>>parser.add_argument('--foo',action='store_const',const=42)
>>>parser.parse_args(['--foo'])
Namespace(foo=42)
  • 'store_true和'store_false'' - 屬于'store_const'的特殊用法,設(shè)定const的默認(rèn)值為True或False并分別進(jìn)行存儲(chǔ)
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='store_true')
>>> parser.add_argument('--bar', action='store_false')
>>> parser.add_argument('--baz', action='store_false')
>>> parser.parse_args('--foo --bar'.split())
Namespace(foo=True, bar=False, baz=True)
  • 'append' - 將每個(gè)參數(shù)的值追加到一個(gè)列表里面
>>>parser = argparse.ArgumentParser()
>>>parser.add_argument('--foo',action='append')
>>>parser.parse_args('--foo a --foo b --foo c'.split())
Namespace(foo=['a', 'b', 'c'])
  • 'append_const' - 當(dāng)多個(gè)參數(shù)需要將常量存儲(chǔ)到一個(gè)列表時(shí)設(shè)置
>>> 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'>])
  • 'count' - 對(duì)參數(shù)出現(xiàn)的次數(shù)進(jìn)行計(jì)數(shù)
>>> parser.add_argument('-v',action='count')
_CountAction(option_strings=['-v'], dest='v', nargs=0, const=None, default=None, type=None, choices=None, help=None, metavar=None)
>>> parser.parse_args(['-vvv'])
Namespace(v=3)
  • '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
(11) metavar

我理解為是對(duì)在命令行所接參數(shù)的樣式的示例,比如--version后面應(yīng)接3位大寫字母(比如YYY),則可以設(shè)定metavar='YYY',意思為此處應(yīng)接三位大寫字母

>>> parser.add_argument('--version',metavar='YYY')
_StoreAction(option_strings=['--version'], dest='version', nargs=None, const=None, default=None, type=None, choices=None, help=None, metavar='YYY')
>>> parser.add_argument('--info',metavar='XX')
_StoreAction(option_strings=['--info'], dest='info', nargs=None, const=None, default=None, type=None, choices=None, help=None, metavar='XX')
>>> parser.parse_args('--version HTB --info HK'.split())
Namespace(info='HK', version='HTB')
>>> parser.print_help()
usage: [-h] [--version YYY] [--info XX]

optional arguments:
  -h, --help     show this help message and exit
  --version YYY
  --info XX
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容