原文地址:https://pythoncaff.com/docs/pymotw/argparse-command-line-option-and-argument-parsing/166

https://docs.python.org/3/library/argparse.html?highlight=argparse#module-argparse-------argparse 官网

http://www.cnblogs.com/arkenstone/p/6250782.html------Python3 -- argparse模块

http://blog.csdn.net/WIinter_FDd/article/details/75786410

https://oldpan.me/archives/argparse-python-order-command--------Argparse-parser模块:python快捷实现命令行操作

这是一篇社区协同翻译的文章,你可以点击右边区块信息里的『改进』按钮向译者提交改进建议。


目标:命令行选项和参数解析

argparse 模块包含了用于创建命令行参数和选项程序的工具。它在 Python 2.7 中加入并作为 optparse 模块的替代者。argparse 模块的实现支持那些在 optparse 中不容易实现的特征,这也导致了向后不兼容的 API 改变,所以是一个新的模块被加入到标准库中。optparse 现在已经被废弃。

创建一个解析器##

使用 argparse 的第一步是创建一个解析器对象然后告诉它要接收什么参数。解析器随后可以在程序运行时用于处理命令行参数。解析器对象 (ArgumentParser) 的构造器接收一些参数来构建用于帮助文本的简介和其他全局表现设置。

  1. import argparse
  2. parser = argparse.ArgumentParser(
  3. description='This is a PyMOTW sample program',
  4. )

Rookie 翻译于 5个月前
 
由 Summer 审阅
 

定义参数##

arpparse 是一个完整的参数处理库。参数可以触发不同动作,这可以通过 add_argument() 的 action 参数来声明。支持的动作包括储存参数值(单独地或这作为列表的一部分存储),当使用一个参数时(包括特殊 true/false 的布尔型数值转换处理)存储一个常数,对参数出现次数进行计数和使用回调函数来使用定制的处理指令。

默认的动作是存储参数值。如果指定了参数类型,参数值会在被储存前转换。如果提供了 dest 参数,命令行参数被解析时参数值会以 dest 参数提供的变量名存储。

解析一个命令行##

在所有参数都被定义后,通过传递一组参数字符串序列给 parse_args() 来解析参数。默认情况下,所有参数从 sys.argv[1:] 中取得,但也可以使用一个字符串列表。选项使用 GNU/POSIX 语法处理,所以选项和参数值在序列里是混合的。

parse_args() 的返回值是一个包含命令参数的 Namespace。这个对象将参数值作为属性保存,所以如果参数的 dest 被设为 "myoption",参数值可以通过 args.myoption 的方式获取。

Rookie 翻译于 5个月前
 
由 Summer 审阅
 

简单的例子##

以下是一个有三个不同选项的例子:一个布尔型选项 (-a), 一个简单的字符串选项 (-b), 和一个整数选项 (-c) 。

argparse_short.py

  1. import argparse
  2. parser = argparse.ArgumentParser(description='Short sample app')
  3. parser.add_argument('-a', action="store_true", default=False)
  4. parser.add_argument('-b', action="store", dest="b")
  5. parser.add_argument('-c', action="store", dest="c", type=int)
  6. print(parser.parse_args(['-a', '-bval', '-c', '3']))

单字符选项传值有几种方式。前面的例子展示了两种不同的方式,-bval 和 -c val

  1. $ python3 argparse_short.py
  2. Namespace(a=True, b='val', c=3)

与 c 相关的值在输出中是一个整数,这是因为 ArgumentParser 被告知在保存这个参数之前要进行转换。

名称多于一个字符的选项,也就是“长”选项也是以这样的方式处理的。

argparse_long.py

  1. import argparse
  2. parser = argparse.ArgumentParser(
  3. description='Example with long option names',
  4. )
  5. parser.add_argument('--noarg', action="store_true",
  6. default=False)
  7. parser.add_argument('--witharg', action="store",
  8. dest="witharg")
  9. parser.add_argument('--witharg2', action="store",
  10. dest="witharg2", type=int)
  11. print(
  12. parser.parse_args(
  13. ['--noarg', '--witharg', 'val', '--witharg2=3']
  14. )
  15. )

结果是类似的。

  1. $ python3 argparse_long.py
  2. Namespace(noarg=True, witharg='val', witharg2=3)

argparse 是一个完整的命令行参数解析工具,可以处理可选参数和必须参数。

argparse_arguments.py

  1. import argparse
  2. parser = argparse.ArgumentParser(
  3. description='Example with nonoptional arguments',
  4. )
  5. parser.add_argument('count', action="store", type=int)
  6. parser.add_argument('units', action="store")
  7. print(parser.parse_args())

在这个例子中,count 参数值是一个整数,unit 参数值以一个字符串保存。如果命令行中缺少了两个参数中任何一个,或者传递的值不能被转换为正确的类型,将会抛出错误。

  1. $ python3 argparse_arguments.py 3 inches
  2. Namespace(count=3, units='inches')
  3. $ python3 argparse_arguments.py some inches
  4. usage: argparse_arguments.py [-h] count units
  5. argparse_arguments.py: error: argument count: invalid int value:
  6. 'some'
  7. $ python3 argparse_arguments.py
  8. usage: argparse_arguments.py [-h] count units
  9. argparse_arguments.py: error: the following arguments are
  10. required: count, units

Rookie 翻译于 5个月前
 
由 Summer 审阅
 

参数动作##

当一个参数被传递时可以触发任何6个内建动作的任何一个。

store

选择性地转换为一个不同的类型后保存参数值。如果没有特别声明动作时这是默认动作。

store_const

保存一个在参数声明时定义的值,而非解析参数时得到的值。这通常被用于实现非布尔型数值的命令行标志。

store_true / store_false

保存相应的布尔型数值,这个动作被用于实现布尔值开关。

append

将参数值保存在一个列表中。如果参数重复了,那么多个参数值将会被保存。

append_const

将参数值保存在参数声明时指定的列表中。

version

打印程序版本详情然后退出

这个示例程序演示了让每个动作类型能够工作的最少配置。

argparse_action.py

  1. import argparse
  2. parser = argparse.ArgumentParser()
  3. parser.add_argument('-s', action='store',
  4. dest='simple_value',
  5. help='Store a simple value')
  6. parser.add_argument('-c', action='store_const',
  7. dest='constant_value',
  8. const='value-to-store',
  9. help='Store a constant value')
  10. parser.add_argument('-t', action='store_true',
  11. default=False,
  12. dest='boolean_t',
  13. help='Set a switch to true')
  14. parser.add_argument('-f', action='store_false',
  15. default=True,
  16. dest='boolean_f',
  17. help='Set a switch to false')
  18. parser.add_argument('-a', action='append',
  19. dest='collection',
  20. default=[],
  21. help='Add repeated values to a list')
  22. parser.add_argument('-A', action='append_const',
  23. dest='const_collection',
  24. const='value-1-to-append',
  25. default=[],
  26. help='Add different values to list')
  27. parser.add_argument('-B', action='append_const',
  28. dest='const_collection',
  29. const='value-2-to-append',
  30. help='Add different values to list')
  31. parser.add_argument('--version', action='version',
  32. version='%(prog)s 1.0')
  33. results = parser.parse_args()
  34. print('simple_value = {!r}'.format(results.simple_value))
  35. print('constant_value = {!r}'.format(results.constant_value))
  36. print('boolean_t = {!r}'.format(results.boolean_t))
  37. print('boolean_f = {!r}'.format(results.boolean_f))
  38. print('collection = {!r}'.format(results.collection))
  39. print('const_collection = {!r}'.format(results.const_collection))

-t 和 -f 选项用于设置修改不同选项值,每个保存 True 或 False。-A 和 -B 的 dest 参数值相同,所以它们的常量会被添加到相同的列表中。

  1. $ python3 argparse_action.py -h
  2. usage: argparse_action.py [-h] [-s SIMPLE_VALUE] [-c] [-t] [-f]
  3. [-a COLLECTION] [-A] [-B] [--version]
  4. optional arguments:
  5. -h, --help show this help message and exit
  6. -s SIMPLE_VALUE Store a simple value
  7. -c Store a constant value
  8. -t Set a switch to true
  9. -f Set a switch to false
  10. -a COLLECTION Add repeated values to a list
  11. -A Add different values to list
  12. -B Add different values to list
  13. --version show program's version number and exit
  14. $ python3 argparse_action.py -s value
  15. simple_value = 'value'
  16. constant_value = None
  17. boolean_t = False
  18. boolean_f = True
  19. collection = []
  20. const_collection = []
  21. $ python3 argparse_action.py -c
  22. simple_value = None
  23. constant_value = 'value-to-store'
  24. boolean_t = False
  25. boolean_f = True
  26. collection = []
  27. const_collection = []
  28. $ python3 argparse_action.py -t
  29. simple_value = None
  30. constant_value = None
  31. boolean_t = True
  32. boolean_f = True
  33. collection = []
  34. const_collection = []
  35. $ python3 argparse_action.py -f
  36. simple_value = None
  37. constant_value = None
  38. boolean_t = False
  39. boolean_f = False
  40. collection = []
  41. const_collection = []
  42. $ python3 argparse_action.py -a one -a two -a three
  43. simple_value = None
  44. constant_value = None
  45. boolean_t = False
  46. boolean_f = True
  47. collection = ['one', 'two', 'three']
  48. const_collection = []
  49. $ python3 argparse_action.py -B -A
  50. simple_value = None
  51. constant_value = None
  52. boolean_t = False
  53. boolean_f = True
  54. collection = []
  55. const_collection = ['value-2-to-append', 'value-1-to-append']
  56. $ python3 argparse_action.py --version
  57. argparse_action.py 1.0

Rookie 翻译于 5个月前
 
由 Summer 审阅
 

选项前缀##

默认语法是基于使用前缀(“-”)表示命令行开关的Unix惯例。argparse 支持也其他前缀,所以程序可以使用符合本地操作系统默认的前缀(比如 windows 的 “'/'”)或者遵循不同的惯例。

argparse_prefix_chars.py

  1. import argparse
  2. parser = argparse.ArgumentParser(
  3. description='Change the option prefix characters',
  4. prefix_chars='-+/',
  5. )
  6. parser.add_argument('-a', action="store_false",
  7. default=None,
  8. help='Turn A off',
  9. )
  10. parser.add_argument('+a', action="store_true",
  11. default=None,
  12. help='Turn A on',
  13. )
  14. parser.add_argument('//noarg', '++noarg',
  15. action="store_true",
  16. default=False)
  17. print(parser.parse_args())

你可以把 ArgumentParser 的 prefix_chars 参数设置为一个包含所有允许的前缀的字符串。重要的一点是要理解尽管 prefix_chars 明确了允许的开关字符,但参数定义时指明了该参数的可用前缀。这样可以精确地控制选项功能,使用不同前缀可能仅仅是选项的别名(比如说平台依赖的命令行语法)或者其他意义(比如使用 '+' 来表示打开某个选项,'-' 来表示关闭某选项)。在上面的例子中,+a 和 -a 是不同的参数,而 //noarg 可以使用 ++noarg 样式,但不能是 --noarg

  1. $ python3 argparse_prefix_chars.py -h
  2. usage: argparse_prefix_chars.py [-h] [-a] [+a] [//noarg]
  3. Change the option prefix characters
  4. optional arguments:
  5. -h, --help show this help message and exit
  6. -a Turn A off
  7. +a Turn A on
  8. //noarg, ++noarg
  9. $ python3 argparse_prefix_chars.py +a
  10. Namespace(a=True, noarg=False)
  11. $ python3 argparse_prefix_chars.py -a
  12. Namespace(a=False, noarg=False)
  13. $ python3 argparse_prefix_chars.py //noarg
  14. Namespace(a=None, noarg=True)
  15. $ python3 argparse_prefix_chars.py ++noarg
  16. Namespace(a=None, noarg=True)
  17. $ python3 argparse_prefix_chars.py --noarg
  18. usage: argparse_prefix_chars.py [-h] [-a] [+a] [//noarg]
  19. argparse_prefix_chars.py: error: unrecognized arguments: --noarg

Rookie 翻译于 5个月前
 
由 Summer 审阅
 

参数来源##

目前的例子里,解析器接收的参数列表来自于显式传递的一个列表,或默认从 sys.argv 中获取。显示传递一个列表给解析器在使用 argparse 来处理不来自命令行的但像命令行一样的指令(比如该命令来自配置文件)很有用。

argparse_with_shlex.py

  1. import argparse
  2. from configparser import ConfigParser
  3. import shlex
  4. parser = argparse.ArgumentParser(description='Short sample app')
  5. parser.add_argument('-a', action="store_true", default=False)
  6. parser.add_argument('-b', action="store", dest="b")
  7. parser.add_argument('-c', action="store", dest="c", type=int)
  8. config = ConfigParser()
  9. config.read('argparse_with_shlex.ini')
  10. config_value = config.get('cli', 'options')
  11. print('Config :', config_value)
  12. argument_list = shlex.split(config_value)
  13. print('Arg List:', argument_list)
  14. print('Results :', parser.parse_args(argument_list))

这个例子使用 configparser 读取配置文件。

  1. [cli]
  2. options = -a -b 2

shlex 可以让拆开配置文件中的字符串变得容易。

  1. $ python3 argparse_with_shlex.py
  2. Config : -a -b 2
  3. Arg List: ['-a', '-b', '2']
  4. Results : Namespace(a=True, b='2', c=None)

在应用程序代码中处理配置文件的另一个方案是使用 fromfile_prefix_chars 告诉 argparse 识别一个特殊参数,这个参数指明了包涵需要处理的参数的文件。

argparse_fromfile_prefix_chars.py

  1. import argparse
  2. import shlex
  3. parser = argparse.ArgumentParser(description='Short sample app',
  4. fromfile_prefix_chars='@',
  5. )
  6. parser.add_argument('-a', action="store_true", default=False)
  7. parser.add_argument('-b', action="store", dest="b")
  8. parser.add_argument('-c', action="store", dest="c", type=int)
  9. print(parser.parse_args(['@argparse_fromfile_prefix_chars.txt']))

这个例子的代码会在发现一个 @ 前缀的参数时停下,然后读取该文件来找到更多参数。这个文件应该每行包含一个参数,如下面例子所示。

argparse_fromfile_prefix_chars.txt

  1. -a
  2. -b
  3. 2

解析 argparse_from_prefix_chars.txt 的输出如下。

  1. $ python3 argparse_fromfile_prefix_chars.py
  2. Namespace(a=True, b='2', c=None)

Rookie 翻译于 5个月前
 
由 Summer 审阅
 

帮助内容##

自动生成的帮助文本##

如果配置为这样做,argparse 会自动生成选项的帮助文本。ArgumentParser 的 add_help 参数可以控制相关选项。

argparse_with_help.py

  1. import argparse
  2. parser = argparse.ArgumentParser(add_help=True)
  3. parser.add_argument('-a', action="store_true", default=False)
  4. parser.add_argument('-b', action="store", dest="b")
  5. parser.add_argument('-c', action="store", dest="c", type=int)
  6. print(parser.parse_args())

帮助选项(-h 和 --help )默认会被自动添加,可以设置 add_help 为 False 来停用这个功能。

argparse_without_help.py

  1. import argparse
  2. parser = argparse.ArgumentParser(add_help=False)
  3. parser.add_argument('-a', action="store_true", default=False)
  4. parser.add_argument('-b', action="store", dest="b")
  5. parser.add_argument('-c', action="store", dest="c", type=int)
  6. print(parser.parse_args())

尽管 -h 和 --help 是请求帮助选项的事实标准,一些应用或某些 argparse 的用法不需要提供帮助内容或这两个选项另有他用。

  1. $ python3 argparse_with_help.py -h
  2. usage: argparse_with_help.py [-h] [-a] [-b B] [-c C]
  3. optional arguments:
  4. -h, --help show this help message and exit
  5. -a
  6. -b B
  7. -c C
  8. $ python3 argparse_without_help.py -h
  9. usage: argparse_without_help.py [-a] [-b B] [-c C]
  10. argparse_without_help.py: error: unrecognized arguments: -h

Rookie 翻译于 5个月前
 
由 Summer 审阅
 

定制帮助内容##

对于需要直接处理帮助内容的应用,ArgumentParser 的一些实用方法在创建 定制动作 来打印带有额外信息的帮助文本时很有用。

argparse_custom_help.py

  1. import argparse
  2. parser = argparse.ArgumentParser(add_help=True)
  3. parser.add_argument('-a', action="store_true", default=False)
  4. parser.add_argument('-b', action="store", dest="b")
  5. parser.add_argument('-c', action="store", dest="c", type=int)
  6. print('print_usage output:')
  7. parser.print_usage()
  8. print()
  9. print('print_help output:')
  10. parser.print_help()

print_usage() 打印参数解析器的简略使用信息,print_help() 会打印完整帮助文本。

  1. $ python3 argparse_custom_help.py
  2. print_usage output:
  3. usage: argparse_custom_help.py [-h] [-a] [-b B] [-c C]
  4. print_help output:
  5. usage: argparse_custom_help.py [-h] [-a] [-b B] [-c C]
  6. optional arguments:
  7. -h, --help show this help message and exit
  8. -a
  9. -b B
  10. -c C

ArgumentParser 使用一个格式化类来控制帮助文本的显示样式。要改变格式化类,可以在实例化 ArgumentParser 时传递 formatter_class 参数。

例如,RawDescriptionHelpFormatter 会绕过程序默认提供的换行。

argparse_raw_description_help_formatter.py

  1. import argparse
  2. parser = argparse.ArgumentParser(
  3. add_help=True,
  4. formatter_class=argparse.RawDescriptionHelpFormatter,
  5. description="""
  6. description
  7. not
  8. wrapped""",
  9. epilog="""
  10. epilog
  11. not
  12. wrapped""",
  13. )
  14. parser.add_argument(
  15. '-a', action="store_true",
  16. help="""argument
  17. help is
  18. wrapped
  19. """,
  20. )
  21. parser.print_help()

命令的介绍和结语的帮助文本会原封不动地打印。

  1. $ python3 argparse_raw_description_help_formatter.py
  2. usage: argparse_raw_description_help_formatter.py [-h] [-a]
  3. description
  4. not
  5. wrapped
  6. optional arguments:
  7. -h, --help show this help message and exit
  8. -a argument help is wrapped
  9. epilog
  10. not
  11. wrapped

RawTextHelpFormatter 视所有帮助文本都是预格式化好的。

argparse_raw_text_help_formatter.py

  1. import argparse
  2. parser = argparse.ArgumentParser(
  3. add_help=True,
  4. formatter_class=argparse.RawTextHelpFormatter,
  5. description="""
  6. description
  7. not
  8. wrapped""",
  9. epilog="""
  10. epilog
  11. not
  12. wrapped""",
  13. )
  14. parser.add_argument(
  15. '-a', action="store_true",
  16. help="""argument
  17. help is not
  18. wrapped
  19. """,
  20. )
  21. parser.print_help()

-a 的帮助文本不会再别整齐地包装起来。

  1. $ python3 argparse_raw_text_help_formatter.py
  2. usage: argparse_raw_text_help_formatter.py [-h] [-a]
  3. description
  4. not
  5. wrapped
  6. optional arguments:
  7. -h, --help show this help message and exit
  8. -a argument
  9. help is not
  10. wrapped
  11. epilog
  12. not
  13. wrapped

原始格式化类可能用于改变帮助文本的格式可能会让例子失效的应用程序中。

MetavarTypeHelpFormatter 还会打印每个选项的类型而非仅有目标变量名称,这个格式化类可用于有很多不同类型选项的应用程序。

argparse_metavar_type_help_formatter.py

  1. import argparse
  2. parser = argparse.ArgumentParser(
  3. add_help=True,
  4. formatter_class=argparse.MetavarTypeHelpFormatter,
  5. )
  6. parser.add_argument('-i', type=int, dest='notshown1')
  7. parser.add_argument('-f', type=float, dest='notshown2')
  8. parser.print_help()

除了显示 dest 的值,与选项相关的参数值类型也会被打印。

  1. $ python3 argparse_metavar_type_help_formatter.py
  2. usage: argparse_metavar_type_help_formatter.py [-h] [-i int] [-f
  3. float]
  4. optional arguments:
  5. -h, --help show this help message and exit
  6. -i int
  7. -f float

Rookie 翻译于 5个月前
 
由 Summer 审阅
 

组织解析器##

为了让实现解析器或提高帮助文本的可用性, argparse 模块提供几个功能来组织参数解析器。

分享解析规则##

程序员通常需要实现一套命令行工具,这个工具接收一组参数,并以某特定方式使用这组参数。例如,一些程序需要在真正执行动作前对用户进行认证,它们都需要支持 --user 和 --password 选项。除了单独地向每个 ArgumentParser 都添加这两个选项外,先定义一个带有共享参数的父解析器,接着继承父解析器并编写用于某特定程序的参数解析器也是一种可能的方案。

第一步是建立有共享参数解析器。由于后续使用父解析器的用户会尝试添加相同的帮助选项,这将会抛出错误,所以父解析器自动生成帮助文本特性被关闭了。

argparse_parent_base.py

  1. import argparse
  2. parser = argparse.ArgumentParser(add_help=False)
  3. parser.add_argument('--user', action="store")
  4. parser.add_argument('--password', action="store")

接下来创建一个使用共享 parents 参数集的解析器:

argparse_uses_parent.py

  1. import argparse
  2. import argparse_parent_base
  3. parser = argparse.ArgumentParser(
  4. parents=[argparse_parent_base.parser],
  5. )
  6. parser.add_argument('--local-arg',
  7. action="store_true",
  8. default=False)
  9. print(parser.parse_args())

最后程序会有所有的三个选项。

  1. $ python3 argparse_uses_parent.py -h
  2. usage: argparse_uses_parent.py [-h] [--user USER]
  3. [--password PASSWORD]
  4. [--local-arg]
  5. optional arguments:
  6. -h, --help show this help message and exit
  7. --user USER
  8. --password PASSWORD
  9. --local-arg

冲突选项##

上面的例子指出添加两个参数名相同的选项会导致异常。冲突解决行为可以通过传递一个 confilct_handler 来改变。两个内建的处理器是 error (默认)和 resolve ,这处理器会根据同名参数的添加顺序选择参数处理器,即后续同名参数会覆盖之前的同名参数。

argparse_conflict_handler_resolve.py

  1. import argparse
  2. parser = argparse.ArgumentParser(conflict_handler='resolve')
  3. parser.add_argument('-a', action="store")
  4. parser.add_argument('-b', action="store", help='Short alone')
  5. parser.add_argument('--long-b', '-b',
  6. action="store",
  7. help='Long and short together')
  8. print(parser.parse_args(['-h']))

在这个例子中,由于最后一个参数处理器使用了已经定义过的参数名,单独选项 -b 会被 --long-b 的别名掩盖。

  1. $ python3 argparse_conflict_handler_resolve.py
  2. usage: argparse_conflict_handler_resolve.py [-h] [-a A]
  3. [--long-b LONG_B]
  4. optional arguments:
  5. -h, --help show this help message and exit
  6. -a A
  7. --long-b LONG_B, -b LONG_B
  8. Long and short together

交换 add_argument() 的调用顺序可以独立的 -b 不被掩盖:

argparse_conflict_handler_resolve2.py

  1. import argparse
  2. parser = argparse.ArgumentParser(conflict_handler='resolve')
  3. parser.add_argument('-a', action="store")
  4. parser.add_argument('--long-b', '-b',
  5. action="store",
  6. help='Long and short together')
  7. parser.add_argument('-b', action="store", help='Short alone')
  8. print(parser.parse_args(['-h']))

现在两个选项可以一起使用了。

  1. $ python3 argparse_conflict_handler_resolve2.py
  2. usage: argparse_conflict_handler_resolve2.py [-h] [-a A]
  3. [--long-b LONG_B]
  4. [-b B]
  5. optional arguments:
  6. -h, --help show this help message and exit
  7. -a A
  8. --long-b LONG_B Long and short together
  9. -b B Short alone

Rookie 翻译于 5个月前
 
由 Summer 审阅
 

参数组##

argparse 把参数定义组合为 “参数组” 。默认情况下,它使用两个参数组,一个用于可选参数,一个用于位置参数。

argparse_default_grouping.py

  1. import argparse
  2. parser = argparse.ArgumentParser(description='Short sample app')
  3. parser.add_argument('--optional', action="store_true",
  4. default=False)
  5. parser.add_argument('positional', action="store")
  6. print(parser.parse_args())

位置参数和可选参数的分组反映在帮助文本的不同区块。

  1. $ python3 argparse_default_grouping.py -h
  2. usage: argparse_default_grouping.py [-h] [--optional] positional
  3. Short sample app
  4. positional arguments:
  5. positional
  6. optional arguments:
  7. -h, --help show this help message and exit
  8. --optional

分组可以改变以让帮助文本更有逻辑性,这样可以让相关的选项和参数值会被一起归档。之前的共享选项例子可以使用定制分组以让认证选项一起出现在帮助文本中。

使用 add_argument_group 创建 “authentication” 分组,然后向分组添加认证相关选项到这个分组中,而非基础解析器。

argparse_parent_with_group.py

  1. import argparse
  2. parser = argparse.ArgumentParser(add_help=False)
  3. group = parser.add_argument_group('authentication')
  4. group.add_argument('--user', action="store")
  5. group.add_argument('--password', action="store")

正如之前的用法,程序可以使用基于分组的父解析器作为 parents 的值。

argparse_uses_parent_with_group.py

  1. import argparse
  2. import argparse_parent_with_group
  3. parser = argparse.ArgumentParser(
  4. parents=[argparse_parent_with_group.parser],
  5. )
  6. parser.add_argument('--local-arg',
  7. action="store_true",
  8. default=False)
  9. print(parser.parse_args())

现在帮助文本会把认证选项显示在一起。

  1. $ python3 argparse_uses_parent_with_group.py -h
  2. usage: argparse_uses_parent_with_group.py [-h] [--user USER]
  3. [--password PASSWORD]
  4. [--local-arg]
  5. optional arguments:
  6. -h, --help show this help message and exit
  7. --local-arg
  8. authentication:
  9. --user USER
  10. --password PASSWORD

Rookie 翻译于 5个月前
 
由 Summer 审阅
 

互斥选项##

定义互斥选项是使用分组特性的特殊情况,这时需要使用 add_mutually_exclusive_group() 而不是 add_argument_group()

argparse_mutually_exclusive.py

  1. import argparse
  2. parser = argparse.ArgumentParser()
  3. group = parser.add_mutually_exclusive_group()
  4. group.add_argument('-a', action='store_true')
  5. group.add_argument('-b', action='store_true')
  6. print(parser.parse_args())

argparse 会保证互斥性,这会让组内只有一个选项可以使用。

  1. $ python3 argparse_mutually_exclusive.py -h
  2. usage: argparse_mutually_exclusive.py [-h] [-a | -b]
  3. optional arguments:
  4. -h, --help show this help message and exit
  5. -a
  6. -b
  7. $ python3 argparse_mutually_exclusive.py -a
  8. Namespace(a=True, b=False)
  9. $ python3 argparse_mutually_exclusive.py -b
  10. Namespace(a=False, b=True)
  11. $ python3 argparse_mutually_exclusive.py -a -b
  12. usage: argparse_mutually_exclusive.py [-h] [-a | -b]
  13. argparse_mutually_exclusive.py: error: argument -b: not allowed
  14. with argument -a

Rookie 翻译于 5个月前
 
由 Summer 审阅
 

嵌套解析器##

之前介绍的使用父解析器是在相关命令之间共享选项的一种方法。一个替代方案是将这些命令组合到单个程序中,使用子解析器来处理命令行的每个部分。这样程序就如 svnhg 和其他有多个命令动作作或子命令的程序一样工作。

一个处理系统目录的程序可能会定义创建,删除和列举目录内容的命令。

argparse_subparsers.py

  1. import argparse
  2. parser = argparse.ArgumentParser()
  3. subparsers = parser.add_subparsers(help='commands')
  4. # 一个列举命令
  5. list_parser = subparsers.add_parser(
  6. 'list', help='List contents')
  7. list_parser.add_argument(
  8. 'dirname', action='store',
  9. help='Directory to list')
  10. # 一个创建命令
  11. create_parser = subparsers.add_parser(
  12. 'create', help='Create a directory')
  13. create_parser.add_argument(
  14. 'dirname', action='store',
  15. help='New directory to create')
  16. create_parser.add_argument(
  17. '--read-only', default=False, action='store_true',
  18. help='Set permissions to prevent writing to the directory',
  19. )
  20. # 一个删除命令
  21. delete_parser = subparsers.add_parser(
  22. 'delete', help='Remove a directory')
  23. delete_parser.add_argument(
  24. 'dirname', action='store', help='The directory to remove')
  25. delete_parser.add_argument(
  26. '--recursive', '-r', default=False, action='store_true',
  27. help='Remove the contents of the directory, too',
  28. )
  29. print(parser.parse_args())

帮助输出将命名的子解析器显示为“命令”,这个“命令”可以在命令行中将其指定为位置参数。

  1. $ python3 argparse_subparsers.py -h
  2. usage: argparse_subparsers.py [-h] {list,create,delete} ...
  3. positional arguments:
  4. {list,create,delete} commands
  5. list List contents
  6. create Create a directory
  7. delete Remove a directory
  8. optional arguments:
  9. -h, --help show this help message and exit

每个子解析器也可用拥有它自己的帮助文本,用于介绍该命令的参数选项。

  1. $ python3 argparse_subparsers.py create -h
  2. usage: argparse_subparsers.py create [-h] [--read-only] dirname
  3. positional arguments:
  4. dirname New directory to create
  5. optional arguments:
  6. -h, --help show this help message and exit
  7. --read-only Set permissions to prevent writing to the directo
  8. ry

当解析参数时,parse_args() 返回的 Namespace 对象只包含命令相关的值。

  1. $ python3 argparse_subparsers.py delete -r foo
  2. Namespace(dirname='foo', recursive=True)

Rookie 翻译于 5个月前
 
由 Summer 审阅
 

高级参数处理##

目前的例子展示了简单的布尔标志,字符串选项或数值参数,还有位置参数。argparse 也支持用于变长参数列表,枚举和常量的复杂参数定义。

变长参数列表##

单个参数定义可以被配置于用来接收来自命令行的多个参数。根据需要或期望的参数个数把 nargs 设为下面表格中的一个。

argparse 变长参数定义标志

含义
N 参数确切个数(比如 3 个)
? 0 或 1 个参数
* 0 或更多参数
+ 至少有一个参数

argparse_nargs.py

  1. import argparse
  2. parser = argparse.ArgumentParser()
  3. parser.add_argument('--three', nargs=3)
  4. parser.add_argument('--optional', nargs='?')
  5. parser.add_argument('--all', nargs='*', dest='all')
  6. parser.add_argument('--one-or-more', nargs='+')
  7. print(parser.parse_args())

解析器强制执行参数计数指令,并生成确切的语法图作为命令帮助文本的一部分。

  1. $ python3 argparse_nargs.py -h
  2. usage: argparse_nargs.py [-h] [--three THREE THREE THREE]
  3. [--optional [OPTIONAL]]
  4. [--all [ALL [ALL ...]]]
  5. [--one-or-more ONE_OR_MORE [ONE_OR_MORE ...]]
  6. optional arguments:
  7. -h, --help show this help message and exit
  8. --three THREE THREE THREE
  9. --optional [OPTIONAL]
  10. --all [ALL [ALL ...]]
  11. --one-or-more ONE_OR_MORE [ONE_OR_MORE ...]
  12. $ python3 argparse_nargs.py
  13. Namespace(all=None, one_or_more=None, optional=None, three=None)
  14. $ python3 argparse_nargs.py --three
  15. usage: argparse_nargs.py [-h] [--three THREE THREE THREE]
  16. [--optional [OPTIONAL]]
  17. [--all [ALL [ALL ...]]]
  18. [--one-or-more ONE_OR_MORE [ONE_OR_MORE ...]]
  19. argparse_nargs.py: error: argument --three: expected 3
  20. argument(s)
  21. $ python3 argparse_nargs.py --three a b c
  22. Namespace(all=None, one_or_more=None, optional=None,
  23. three=['a', 'b', 'c'])
  24. $ python3 argparse_nargs.py --optional
  25. Namespace(all=None, one_or_more=None, optional=None, three=None)
  26. $ python3 argparse_nargs.py --optional with_value
  27. Namespace(all=None, one_or_more=None, optional='with_value',
  28. three=None)
  29. $ python3 argparse_nargs.py --all with multiple values
  30. Namespace(all=['with', 'multiple', 'values'], one_or_more=None,
  31. optional=None, three=None)
  32. $ python3 argparse_nargs.py --one-or-more with_value
  33. Namespace(all=None, one_or_more=['with_value'], optional=None,
  34. three=None)
  35. $ python3 argparse_nargs.py --one-or-more with multiple values
  36. Namespace(all=None, one_or_more=['with', 'multiple', 'values'],
  37. optional=None, three=None)
  38. $ python3 argparse_nargs.py --one-or-more
  39. usage: argparse_nargs.py [-h] [--three THREE THREE THREE]
  40. [--optional [OPTIONAL]]
  41. [--all [ALL [ALL ...]]]
  42. [--one-or-more ONE_OR_MORE [ONE_OR_MORE ...]]
  43. argparse_nargs.py: error: argument --one-or-more: expected
  44. at least one argument

Rookie 翻译于 5个月前
 
由 Summer 审阅
 

参数类型##

argparse 将所有参数视为字符串,除非被告知要将参数转换为其他类型。add_argument() 的 type() 参数定义了一个转换函数,这个函数会被 ArgumentParser 用来把参数值转换为其他类型。

argparse_type.py

  1. import argparse
  2. parser = argparse.ArgumentParser()
  3. parser.add_argument('-i', type=int)
  4. parser.add_argument('-f', type=float)
  5. parser.add_argument('--file', type=open)
  6. try:
  7. print(parser.parse_args())
  8. except IOError as msg:
  9. parser.error(str(msg))

任何接收一个字符串的可调用对象都可以被传递为 type,包括内建类型比如 int 和 float 甚至 open()

  1. $ python3 argparse_type.py -i 1
  2. Namespace(f=None, file=None, i=1)
  3. $ python3 argparse_type.py -f 3.14
  4. Namespace(f=3.14, file=None, i=None)
  5. $ python3 argparse_type.py --file argparse_type.py
  6. Namespace(f=None, file=<_io.TextIOWrapper
  7. name='argparse_type.py' mode='r' encoding='UTF-8'>, i=None)

如果类型转换失败,argparser 会抛出一个异常。TypeError 和 ValueError 会被自动捕捉并转换为简单的错误信息提供给用户。其他错误,比如下面例子里输入文件不存在导致的 IOError 必须由调用者处理。

  1. $ python3 argparse_type.py -i a
  2. usage: argparse_type.py [-h] [-i I] [-f F] [--file FILE]
  3. argparse_type.py: error: argument -i: invalid int value: 'a'
  4. $ python3 argparse_type.py -f 3.14.15
  5. usage: argparse_type.py [-h] [-i I] [-f F] [--file FILE]
  6. argparse_type.py: error: argument -f: invalid float value:
  7. '3.14.15'
  8. $ python3 argparse_type.py --file does_not_exist.txt
  9. usage: argparse_type.py [-h] [-i I] [-f F] [--file FILE]
  10. argparse_type.py: error: [Errno 2] No such file or directory:
  11. 'does_not_exist.txt'

要限制参数值为预先定义的一组值,可以使用 choices 参数。

argparse_choices.py

  1. import argparse
  2. parser = argparse.ArgumentParser()
  3. parser.add_argument(
  4. '--mode',
  5. choices=('read-only', 'read-write'),
  6. )
  7. print(parser.parse_args())

如果 --mode 的参数值不是允许值之一,程序会抛出错误并停止。

  1. $ python3 argparse_choices.py -h
  2. usage: argparse_choices.py [-h] [--mode {read-only,read-write}]
  3. optional arguments:
  4. -h, --help show this help message and exit
  5. --mode {read-only,read-write}
  6. $ python3 argparse_choices.py --mode read-only
  7. Namespace(mode='read-only')
  8. $ python3 argparse_choices.py --mode invalid
  9. usage: argparse_choices.py [-h] [--mode {read-only,read-write}]
  10. argparse_choices.py: error: argument --mode: invalid choice:
  11. 'invalid' (choose from 'read-only', 'read-write')

Rookie 翻译于 5个月前
 
由 Summer 审阅
 

文件参数##

尽管 file 对象可以通过一个字符串参数实例化,但这个对象没有包含访问模式参数。FileType 提供了一种更灵活的方式来指定一个参数是文件,并且包含了访问模式和缓冲区大小。

argparse_FileType.py

  1. import argparse
  2. parser = argparse.ArgumentParser()
  3. parser.add_argument('-i', metavar='in-file',
  4. type=argparse.FileType('rt'))
  5. parser.add_argument('-o', metavar='out-file',
  6. type=argparse.FileType('wt'))
  7. try:
  8. results = parser.parse_args()
  9. print('Input file:', results.i)
  10. print('Output file:', results.o)
  11. except IOError as msg:
  12. parser.error(str(msg))

解析后的参数值是被打开文件的句柄。应用程序要负责不需要文件后关闭文件。

  1. $ python3 argparse_FileType.py -h
  2. usage: argparse_FileType.py [-h] [-i in-file] [-o out-file]
  3. optional arguments:
  4. -h, --help show this help message and exit
  5. -i in-file
  6. -o out-file
  7. $ python3 argparse_FileType.py -i argparse_FileType.py -o tmp_\
  8. file.txt
  9. Input file: <_io.TextIOWrapper name='argparse_FileType.py'
  10. mode='rt' encoding='UTF-8'>
  11. Output file: <_io.TextIOWrapper name='tmp_file.txt' mode='wt'
  12. encoding='UTF-8'>
  13. $ python3 argparse_FileType.py -i no_such_file.txt
  14. usage: argparse_FileType.py [-h] [-i in-file] [-o out-file]
  15. argparse_FileType.py: error: argument -i: can't open
  16. 'no_such_file.txt': [Errno 2] No such file or directory:
  17. 'no_such_file.txt'

Rookie 翻译于 5个月前
 
由 Summer 审阅
 

定制动作##

除了之前介绍的内建动作,还可以通过提供实现 Action API 的对象来定义自定义动作。传递给 add_argument() 作为 action 的对象应该接受被定义参数的所有参数(也就是传递给 add_argument 的所有参数)并返回一个可调用对象,这个可调用对象接收 parser 作为参数解析器,namespace 持有参数解析结果,value 为参数值,和触发动作的 option_string

一个 Action 类提供了定义新动作的便捷起点。Action 的构造器会处理参数定义,所以子类只需要重写 __call__()

argparse_custom_action.py

  1. import argparse
  2. class CustomAction(argparse.Action):
  3. def __init__(self,
  4. option_strings,
  5. dest,
  6. nargs=None,
  7. const=None,
  8. default=None,
  9. type=None,
  10. choices=None,
  11. required=False,
  12. help=None,
  13. metavar=None):
  14. argparse.Action.__init__(self,
  15. option_strings=option_strings,
  16. dest=dest,
  17. nargs=nargs,
  18. const=const,
  19. default=default,
  20. type=type,
  21. choices=choices,
  22. required=required,
  23. help=help,
  24. metavar=metavar,
  25. )
  26. print('Initializing CustomAction')
  27. for name, value in sorted(locals().items()):
  28. if name == 'self' or value is None:
  29. continue
  30. print(' {} = {!r}'.format(name, value))
  31. print()
  32. return
  33. def __call__(self, parser, namespace, values,
  34. option_string=None):
  35. print('Processing CustomAction for {}'.format(self.dest))
  36. print(' parser = {}'.format(id(parser)))
  37. print(' values = {!r}'.format(values))
  38. print(' option_string = {!r}'.format(option_string))
  39. # 对输入值做一些处理
  40. if isinstance(values, list):
  41. values = [v.upper() for v in values]
  42. else:
  43. values = values.upper()
  44. # 以传递给构造器的目标变量保存结果
  45. # variable given to our constructor.
  46. setattr(namespace, self.dest, values)
  47. print()
  48. parser = argparse.ArgumentParser()
  49. parser.add_argument('-a', action=CustomAction)
  50. parser.add_argument('-m', nargs='*', action=CustomAction)
  51. results = parser.parse_args(['-a', 'value',
  52. '-m', 'multivalue',
  53. 'second'])
  54. print(results)

value 的类型取决于 nargs 的值。如果参数运行多重值,value 将会是一个列表即使它只包含一个元素。

option_string 的值同样决定于原始参数定义。对于位置参数,option_string 一直是 None

  1. $ python3 argparse_custom_action.py
  2. Initializing CustomAction
  3. dest = 'a'
  4. option_strings = ['-a']
  5. required = False
  6. Initializing CustomAction
  7. dest = 'm'
  8. nargs = '*'
  9. option_strings = ['-m']
  10. required = False
  11. Processing CustomAction for a
  12. parser = 4315836992
  13. values = 'value'
  14. option_string = '-a'
  15. Processing CustomAction for m
  16. parser = 4315836992
  17. values = ['multivalue', 'second']
  18. option_string = '-m'
  19. Namespace(a='VALUE', m=['MULTIVALUE', 'SECOND'])

另见#

#

(转) argparse — 解析命令参数和选项的更多相关文章

  1. python argparse:命令行参数解析详解

    简介 本文介绍的是argparse模块的基本使用方法,尤其详细介绍add_argument内建方法各个参数的使用及其效果. 本文翻译自argparse的官方说明,并加上一些笔者的理解 import a ...

  2. argparse:命令行参数解析详解

    简介# 本文介绍的是argparse模块的基本使用方法,尤其详细介绍add_argument内建方法各个参数的使用及其效果. 本文翻译自argparse的官方说明,并加上一些笔者的理解 Copy im ...

  3. Python技法:用argparse模块解析命令行选项

    1. 用argparse模块解析命令行选项 我们在上一篇博客<Linux:可执行程序的Shell传参格式规范>中介绍了Linux系统Shell命令行下可执行程序应该遵守的传参规范(包括了各 ...

  4. argparse解析参数模块

    一.简介: argparse是python用于解析命令行参数和选项的标准模块,用于代替已经过时的optparse模块.argparse模块的作用是用于解析命令行参数,例如python parseTes ...

  5. python 解析命令行选项

    问题: 程序如何能够解析命令行选项 解决方案 argparse 模块可被用来解析命令行选项 argparse 模块 argparse 模块是标准库中最大的模块之一,拥有大量的配置选项 dest 参数指 ...

  6. 『Argparse』命令行解析

    一.基本用法 Python标准库推荐使用的命令行解析模块argparse 还有其他两个模块实现这一功能,getopt(等同于C语言中的getopt())和弃用的optparse.因为argparse是 ...

  7. python解析命令行参数

    常常需要解析命令行参数,经常忘记,好烦,总结下来吧. 1.Python 中也可以所用 sys 的 sys.argv 来获取命令行参数: sys.argv 是命令行参数列表 参数个数:len(sys.a ...

  8. Shell 参数(2) --解析命令行参数工具:getopts/getopt

    getopt 与 getopts 都是 Bash 中用来获取与分析命令行参数的工具,常用在 Shell 脚本中被用来分析脚本参数. 两者的比较 (1)getopts 是 Shell 内建命令,geto ...

  9. C语言中使用库函数解析命令行参数

    在编写需要命令行参数的C程序的时候,往往我们需要先解析命令行参数,然后根据这些参数来启动我们的程序. C的库函数中提供了两个函数可以用来帮助我们解析命令行参数:getopt.getopt_long. ...

随机推荐

  1. openstack之flavor管理

    概览 [root@cc07 ~]# nova help | grep flavor flavor-access-add Add flavor access for the given tenant. ...

  2. es6函数的新语法

    函数的默认值 function(x,y=10){ //赋予了y就有了默认值为10,如果y赋值了,就回被覆盖,否则就是默认值10 变量已经有默认值了,所以不用再次用let或者const声明啦 }

  3. jquery取消事件冒泡的三种方法展示

    jquery取消事件冒泡的三种方法展示 html代码 <!doctype html> <html> <head> <meta charset="ut ...

  4. MIT Molecular Biology 笔记6 转录的调控

    视频  https://www.bilibili.com/video/av7973580?from=search&seid=16993146754254492690 教材 Molecular ...

  5. Android学习指南之三十八:Android手势操作编程[转]

    手势操作在我们使用智能设备的过程中奉献了不一样的体验.Android开发中必然会进行手势操作方面的编程.那么它的原理是怎样的呢?我们如何进行手势操作编程呢? 手势操作原理 首先,在Android系统中 ...

  6. 位图bitbucket

    问题:假设有500w条数据,数据是在2^32-1的范围内,数据重复,如何减少内存对数字进行统计呢? 如果用字典来标记数字是否已经统计过来,数字做为key, value仅为0 or1,那么这样需要消耗 ...

  7. C(m,n)算法

    排列组合:C(m,n),m为给定数列,n为要从数列m中取元素的数量,GetResult()获取所有不重复的组合. public class MathCombination<T> { Lis ...

  8. 20145232 韩文浩 《Java程序设计》第8周学习总结

    教材学习内容总结 14 NIO与NIO2 NIO使用频道(channel)来衔接数据节点,对数据区的标记提供了clear(),rewind(),flip(),compact()等高级操作. 想要取得c ...

  9. java类与继承(转载)

    关于java的类与继承面链接是一个网友总结的,还有列子我个人觉得很详细 固拿来收藏,需要的朋友可从这里访问: http://www.cnblogs.com/dolphin0520/p/3803432. ...

  10. Hdu2841 Visible Trees 2017-06-27 22:13 24人阅读 评论(0) 收藏

    Visible Trees Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) To ...