argparse模块 主要用来处理传入的命令行参数,之前版本有使用 optparse模块 实现类似的效果,不过 optparse模块 已停止更新,并不推荐使用了。

argparse模块 使用:

  • ArgumentParser - 创建parser实例。
  • add_argument - 添加命令行参数。
  • parse_args - 处理参数。

其中关键的部分是 add_argument

1
2
3
4
5
6
7
8
9
# argsparse_test.py
from argparse import ArgumentParser

parser = ArgumentParser(description="This is a test parser.")

parser.add_argument('-a', action="store_true", default=False, help="Set bool value.")

args = parser.parse_args()
print("a's value is {}".format(args.a))
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
$ python argsparse_test.py -h
usage: argsparse_test.py [-h] [-a]

This is a test parser.

optional arguments:
  -h, --help  show this help message and exit
  -a          Set bool value.

$ python3 argsparse_test.py -a
a's value is False

$ python3 argsparse_test.py -a
a's value is True

上面添加了一个参数a,命令行后没 -a 参数时,使用的是默认值 False,使用 -a 后,会根据 action 参数的设置改变。

ArgumentParser类 继承了 _ActionsContainer类,后者在初始化时,会注册很多个 action事件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class _ActionsContainer(object):
    def __init__(self,
                 description,
                 prefix_chars,
                 argument_default,
                 conflict_handler):
        super(_ActionsContainer, self).__init__()

        self.description = description
        self.argument_default = argument_default
        self.prefix_chars = prefix_chars
        self.conflict_handler = conflict_handler

        # set up registries
        self._registries = {}

        # register actions
        self.register('action', None, _StoreAction)
        self.register('action', 'store', _StoreAction)
        self.register('action', 'store_const', _StoreConstAction)
        self.register('action', 'store_true', _StoreTrueAction)
        self.register('action', 'store_false', _StoreFalseAction)
        self.register('action', 'append', _AppendAction)
        self.register('action', 'append_const', _AppendConstAction)
        self.register('action', 'count', _CountAction)
        self.register('action', 'help', _HelpAction)
        self.register('action', 'version', _VersionAction)
        self.register('action', 'parsers', _SubParsersAction)
        ...

在使用 add_argument函数 添加 命令行参数 时,会根据指定的 action参数 在注册字典中找到对应的 命令行参数 对应的 action类

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
    def add_argument(self, *args, **kwargs):
        ...
        # create the action object, and add it to the parser
        action_class = self._pop_action_class(kwargs)
        if not callable(action_class):
            raise ValueError('unknown action "%s"' % (action_class,))
        action = action_class(**kwargs)
        ...

    def _pop_action_class(self, kwargs, default=None):
        action = kwargs.pop('action', default)
        return self._registry_get('action', action, action)

action 的类型主要有以下几种:

  • store - 默认类型,存储。
  • store_const - 存储类型,参数后无需跟数据,使用后,将const参数对应的值赋于参数。
  • store_true/store_false - 存储bool类型。
  • append - 存储列表类型。
  • append_const - 存储列表类型,参数后无需跟数据,使用后,将const参数对应的值赋于参数。
  • count - 统计参数出现的个数。
  • version - 版本信息。

这儿有个很好的例子: https://pymotw.com/3/argparse/index.html#argument-actions

add_argument函数 还有一些其他的传入参数,解释如下:

  • dest - 解析出来的参数在程序中的参数名。
  • default - 默认值。
  • const - 与action参数有关,如果设置了,则 store_constappend_const - 会使用 const参数 传入的值。
  • type - 参数解析后的类型。
  • metavar - 在help中显示在usage说明参数后面跟随的变量。