python命令行解析工具argparse模塊


轉自: http://www.cnblogs.com/fireflow/p/4841389.html

python命令行解析工具argparse模塊【1】

  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
usage: prog.py [
-h] [--sum] N [N ...]
prog.py: error: argument N: invalid int value:
'a'
    下面我們詳細解釋這個例子:        1.創建parser        首先,創建一個ArgumentParser對象。
>>> 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'])
Namespace(accumulate
=<built-in function sum>, integers=[7, -1, 42])
     如果在腳本中調用這個函數,parse_args()不會解析任何參數。ArgumentParser會從sys.argv中自動檢測命令行參數。




argparse模塊【2】


argparse. 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
復制代碼
 

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com 联系我们: