一 argparse模塊
python標準庫模塊argparse用於解析命令行參數,編寫用戶友好的命令行界面,該模塊還會自動生成幫助信息,並在所給參數無效時報錯.
首先看一個例子:
#arg_parse.py
#coding:utf-8
import argparse
parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('integers', metavar='N', type=int, nargs='+',help='an integer for the accumulator')
parser.add_argument('--sum', dest='accumulate', action='store_const',const=sum, default=max,
help='sum the integers (default: find the max)')
args = parser.parse_args()
print(args.accumulate(args.integers))
將上述代碼保存爲arg_parse.py,在命令行運行該腳本。使用-h選項可以查看幫助信息
$ python prog.py -h
usage: prog.py [-h] [--sum] N [N ...]
Process some integers.
positional arguments:
N an integer for the accumulator
optional arguments:
-h, --help show this help message and exit
--sum sum the integers (default: find the max)
如果不指定–sum選項,則找出輸入參數中的最大值,否則求和。
$ python prog.py 1 2 3 4
4
$ python prog.py 1 2 3 4 --sum
10
ArgumentParser 對象
使用argparse的第一步是創建一個ArgumentParser對象,這個ArgumentParser對象中會保存所有將命令行參數轉爲python數據類型的必須信息.使用argparse.ArgumentParser創建ArgumentParser對象.
argparse.ArgumentParser(prog=None,
usage=None,
epilog=None,
parents=[],
formatter_class=argparse.HelpFormatter,
prefix_chars='-',
fromfile_prefix_chars=None,
argument_default=None,
conflict_handler='error',
add_help=True)
下面介紹上述函數幾個常用的參數
1.prog
默認情況下,ArgumentParser對象根據sys.argv[0]的值(不包括路徑名)生成幫助信息中的程序名.
sys.argv
$ cat myprogram.py
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--foo', help='foo help')
args = parser.parse_args()
$ python myprogram.py --help
usage: myprogram.py [-h] [--foo FOO] #注意程序名
optional arguments:
-h, --help show this help message and exit
--foo FOO foo help
$ cd ..
$ python subdir\myprogram.py --help
usage: myprogram.py [-h] [--foo FOO] #注意程序名
optional arguments:
-h, --help show this help message and exit
--foo FOO foo help
也可以人爲指定一個程序名
>>> parser = argparse.ArgumentParser(prog='myprogram')
>>> parser.print_help()
usage: myprogram [-h] #注意程序名
optional arguments:
-h, --help show this help message and exit
在ArgumentParser對象的函數中,通過%(prog)s可以引用程序名
>>> parser = argparse.ArgumentParser(prog='myprogram')
>>> parser.add_argument('--foo', help='foo of the %(prog)s program')
>>> parser.print_help()
usage: myprogram [-h] [--foo FOO]
optional arguments:
-h, --help show this help message and exit
--foo FOO foo of the myprogram program
2.使用
默認情況下,ArgumentParser對象可以根據參數自動生成用法信息
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('--foo', nargs='?', help='foo help')
>>> parser.add_argument('bar', nargs='+', help='bar help')
>>> parser.print_help()
usage: PROG [-h] [--foo [FOO]] bar [bar ...] #這是自動生成的usage信息
positional arguments:
bar bar help
optional arguments:
-h, --help show this help message and exit
--foo [FOO] foo help
同樣我們也可以指定usage
>>> parser = argparse.ArgumentParser(prog='PROG', usage='%(prog)s [options]')
>>> parser.add_argument('--foo', nargs='?', help='foo help')
>>> parser.add_argument('bar', nargs='+', help='bar help')
>>> parser.print_help()
usage: PROG [options]
positional arguments:
bar bar help
optional arguments:
-h, --help show this help message and exit
--foo [FOO] foo help
description
description 用於展示程序的簡要介紹信息,通常包括:這個程序可以做什麼、怎麼做。在幫助信息中 description位於用法信息與參數說明之間
>>> parser = argparse.ArgumentParser(description='A foo that bars')
>>> parser.print_help()
usage: argparse.py [-h] #用法信息
A foo that bars # description
optional arguments: #參數說明
-h, --help show this help message and exit
epilog
與description類似,程序的額外描述信息,位於參數說明之後
>>> parser = argparse.ArgumentParser(
... description='A foo that bars',
... epilog="And that's how you'd foo a bar")
>>> parser.print_help()
usage: argparse.py [-h]
A foo that bars
optional arguments:
-h, --help show this help message and exit
And that's how you'd foo a bar
5.parents
有時多個解析器可能有相同的參數集,爲了實現代碼複用,我們可以將這些相同的參數集提取到一個單獨的解析器中,在創建其它解析器時通過parents指定父解析器,這樣新創建的解析器中就包含了相同的參數集。
>>> parent_parser = argparse.ArgumentParser(add_help=False)
>>> parent_parser.add_argument('--parent', type=int)
>>> foo_parser = argparse.ArgumentParser(parents=[parent_parser])
>>> foo_parser.add_argument('foo')
>>> foo_parser.parse_args(['--parent', '2', 'XXX'])
Namespace(foo='XXX', parent=2)
>>> bar_parser = argparse.ArgumentParser(parents=[parent_parser])
>>> bar_parser.add_argument('--bar')
>>> bar_parser.parse_args(['--bar', 'YYY'])
Namespace(bar='YYY', parent=None)
要注意的一點事:創建父解析器時要指定 add_help=False, 否則會報錯(ArgumentParser對象會找到兩個-h/-help選項)
6.formatter_class
通過formatter_class可以定製幫助信息,通過一下幾種格式化類
class argparse.RawDescriptionHelpFormatter
class argparse.RawTextHelpFormatter
class argparse.ArgumentDefaultsHelpFormatter
class argparse.MetavarTypeHelpFormatter
RawDescriptionHelpFormatter 用於定製description和epilog, 默認情況下description和epilog是自動換行的.
>>> parser = argparse.ArgumentParser(
... prog='PROG',
... description='''this description\n
... was indented weird\n
... but that is okay''',
... epilog='''
... likewise for this epilog whose whitespace will
... be cleaned up and whose words will be wrapped
... across a couple lines''')
>>> parser.print_help()
usage: PROG [-h]
this description was indented weird but that is okay
optional arguments:
-h, --help show this help message and exit
likewise for this epilog whose whitespace will be cleaned up and whose words
will be wrapped across a couple lines
利用RawDescriptionHelpFormatter實現description和epilog換行
>>> parser = argparse.ArgumentParser(
... prog='PROG',
... formatter_class=argparse.RawDescriptionHelpFormatter,
... description=textwrap.dedent('''\
... Please do not mess up this text!
... --------------------------------
... I have indented it
... exactly the way
... I want it
... '''))
>>> parser.print_help()
usage: PROG [-h]
Please do not mess up this text!
--------------------------------
I have indented it
exactly the way
I want it
optional arguments:
-h, --help show this help message and exit
RawTextHelpFormatter maintains whitespace for all sorts of help text, including argument descriptions.
ArgumentDefaultsHelpFormatter automatically adds information about default values to each of the argument help messages:
7.prefix_chars
一般情況下,我們使用’-‘作爲選項前綴,ArgumentParser也支持自定義選項前綴,通過prefix_chars
>>> parser = argparse.ArgumentParser(prog='PROG', prefix_chars='-+')
>>> parser.add_argument('+f')
>>> parser.add_argument('++bar')
>>> parser.parse_args('+f X ++bar Y'.split())
Namespace(bar='Y', f='X')
8.add_help
是否禁用-h -help選項
>>> parser = argparse.ArgumentParser(prog='PROG', add_help=False)
>>> parser.add_argument('--foo', help='foo help')
>>> parser.print_help()
usage: PROG [--foo FOO]
optional arguments:
--foo FOO foo help
三 add_argument()方法
argumentParser.add_argument(name or flags...[,action][,nargs][,const][,default]
[,type][,choices][,required][,help][,metavar][,dest])