轉自: http://www.cnblogs.com/fireflow/p/4841389.html
argparse是python中很好用的一個命令行解析模塊,使用它我們可以很方便的創建用戶友好型命令行程序。而且argparse會自動生成幫助信息和錯誤信息。
一、示例例如下面的例子,從命令行中獲取幾個整數,然后獲取它們的和或者最大值。
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)
從命令行中輸入prog.py -h,會顯示如下信息
$ 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)
如果使用合適的參數,還可以求和或者取得最大值。
$ prog.py 1 2 3 4如果傳遞錯誤的參數,將返回錯誤信息。
4
$ prog.py 1 2 3 4 --sum
10
$ prog.py a b c下面我們詳細解釋這個例子: 1.創建parser 首先,創建一個ArgumentParser對象。
usage: prog.py [-h] [--sum] N [N ...]
prog.py: error: argument N: invalid int value: 'a'
>>> parser = argparse.ArgumentParser(description='Process some integers.')ArgumentParser對象中保存着解析命令行參數所必需的信息。 2.添加參數 通過調用add_argument()方法將命令行中的參數保存到ArgumentParser對象中。
>>> 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)')
后面再調用parse_args(),將會返回一個包含integers和accumulate兩個屬性的對象,integers是一個列表,而accumulate可以是sum()函數(如果指定了--sum)或者max()函數。
3.解析參數
通過parse_args()方法解析參數,返回一個命名空間對象。
>>> parser.parse_args(['--sum', '7', '-1', '42'])如果在腳本中調用這個函數,parse_args()不會解析任何參數。ArgumentParser會從sys.argv中自動檢測命令行參數。
Namespace(accumulate=<built-in function sum>, integers=[7, -1, 42])
ArgumentParser
([
description][,
epilog][,
prog][,
usage][,
add_help][,
argument_default][,
parents][,
prefix_chars][,
conflict_handler][,
formatter_class])
創建一個ArgumentParser對象。每個參數都有其特殊含義,簡單的介紹如下:
description:help參數之前顯示的信息
epilog:help參數之后顯示的信息。
add_help:給解析器添加-h/--help選項(默認為True)
argument_default:設置參數的默認值(默認為None)
parents:ArgumentParser對象組成列表,這些對象中的參數也要包含進來。
prefix_chars:可選參數之前的前綴(默認為-)
fromfile_prefix_chars:如果是從文件中讀取參數,這個文件名參數的前綴(默認為None)
formatter_class:一個自定義幫助信息格式化輸出的類
conflict_handler:通常不需要,定義了處理沖突選項的策略
prog:程序名(默認為sys.argv[0])
usage:程序的使用用例,默認情況下會自動生成。
1.description
大多數調用ArgumentParser構造函數的例子中都會使用description參數,這個參數會簡短的描述這個程序的用途。
>>> parser = argparse.ArgumentParser(description='A foo that bars')
>>> parser.print_help()
usage: argparse.py [-h]
A foo that bars
optional arguments:
-h, --help show this help message and exit
默認情況下,這個描述信息前后都會有一個空行,如果想改變這種顯示,可以使用formatter_class參數
2.epilog
有些程序可能想在描述信息之后再繼續展示別的信息,這個時候可以使用epilog參數設置。
>>> 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
跟description參數一樣,這個信心前后都有一個空行,同樣可以通過formatter-class參數設置。
3.add_help
默認情況下,ArgumentParser對象對自動添加-h/--help選項,以展示幫助信息。例如,myprogam.py代碼如下所示:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--foo', help='foo help')
args = parser.parse_args()
如果命令行支持-h/--help參數,則下面的代碼輸出如下:
$ python myprogram.py --help
usage: myprogram.py [-h] [--foo FOO]
optional arguments:
-h, --help show this help message and exit
--foo FOO foo help
通過設置add_help=False可以取消幫助信息的顯示
>>> 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
4.prefix_chars
大多數命令行參數使用-作為前綴,但是可以使用prefix_char=argument來自定義前綴。
>>> 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')
5.fromfile_prefix_chars
有時候需要從文件中獲取參數,如果參數過多的話。這時,如果設置了fromfile_prefix_chars參數的話,解析器會將帶有這個設定前綴的參數作為文件處理。
>>> with open('args.txt', 'w') as fp:
... fp.write('-f\nbar')
>>> parser = argparse.ArgumentParser(fromfile_prefix_chars='@')
>>> parser.add_argument('-f')
>>> parser.parse_args(['-f', 'foo', '@args.txt'])
Namespace(f='bar')
文件中必須是每行對應一個參數。
6.argument_default
設置參數的默認值。
>>> parser = argparse.ArgumentParser(argument_default=argparse.SUPPRESS)
>>> parser.add_argument('--foo')
>>> parser.add_argument('bar', nargs='?')
>>> parser.parse_args(['--foo', '1', 'BAR'])
Namespace(bar='BAR', foo='1')
>>> parser.parse_args([])
Namespace()
7.parents
有時候,幾個解析器共享一個參數集合,可以將這個共享參數集合傳遞給parent,解析器對象會將這些共享參數包含在內。
>>> 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,否則將會出現兩個-h/--help選項,從而導致錯誤。
8.formatter_class
通過指定formatter_class可以對幫助信息進行格式化輸出。這樣的類有三個:argparse.RawDescriptionHelpFormatter, argparse.RawTextHelpFormatter 以及argparse.ArgumentDefaultsHelp
默認情況下,description以及epilog信息前后都有一個空行。
>>> parser = argparse.ArgumentParser(
... prog='PROG',
... description='''this description
... was indented weird
... 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
如果將formatter_class參數設置為argparse.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則會保留預定義的幫助信息中的空格。
另外一個類ArgumentDefaultsHelpFormatter
則會給所有的有默認值的參數添加默認值信息。
>>> parser = argparse.ArgumentParser(
... prog='PROG',
... formatter_class=argparse.ArgumentDefaultsHelpFormatter)
>>> parser.add_argument('--foo', type=int, default=42, help='FOO!')
>>> parser.add_argument('bar', nargs='*', default=[1, 2, 3], help='BAR!')
>>> parser.print_help()
usage: PROG [-h] [--foo FOO] [bar [bar ...]]
positional arguments:
bar BAR! (default: [1, 2, 3])
optional arguments:
-h, --help show this help message and exit
--foo FOO FOO! (default: 42)
9.conflict_handler
ArgumentParser對象不允許傳入兩個相同的參數,否則會報錯。
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('-f', '--foo', help='old foo help')
>>> parser.add_argument('--foo', help='new foo help')
Traceback (most recent call last):
..
ArgumentError: argument --foo: conflicting option string(s): --foo
通過設置conflict_handler為resolve,可以用新的參數覆蓋舊的同名參數。
>>> parser = argparse.ArgumentParser(prog='PROG', conflict_handler='resolve')
>>> parser.add_argument('-f', '--foo', help='old foo help')
>>> parser.add_argument('--foo', help='new foo help')
>>> parser.print_help()
usage: PROG [-h] [-f FOO] [--foo FOO]
optional arguments:
-h, --help show this help message and exit
-f FOO old foo help
--foo FOO new foo help
10.prog
默認情況下,ArgumentParser對象使用sys.argv[0]來獲取程序名。大多數情況下下,默認值就足夠了,例如:
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
如果想改變這個默認值,可以設置prog。
>>> parser = argparse.ArgumentParser(prog='myprogram')
>>> parser.print_help()
usage: myprogram [-h]
optional arguments:
-h, --help show this help message and exit
11.usage
默認情況下,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 ...]
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
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。