用Python中的argparse解析命令行参数

85 阅读2分钟

有几个用于命令行参数解析的第三方库,但标准库的模块argparse 也不是什么好东西。

不需要增加任何依赖性,你就可以编写一个具有有用的参数解析功能的灵巧的命令行工具。

Python中的参数解析

当用argparse 来解析命令行参数时,第一步是配置一个ArgumentParser 对象。这通常是在全局模块范围内完成的,因为仅仅配置解析器是没有副作用的。

import argparse
PARSER = argparse.ArgumentParser()

ArgumentParser 上最重要的方法是.add_argument() 。它有几个变体。默认情况下,它添加一个期望值的参数。

PARSER.add_argument("--value")

要看它的动作,请调用方法.parse_args()

PARSER.parse_args(["--value", "some-value"])
Namespace(value='some-value')

也可以使用= 的语法。

PARSER.parse_args(["--value=some-value"])
Namespace(value='some-value')

你还可以指定一个简短的 "别名",以便在输入提示符时获得更短的命令行。

PARSER.add_argument("--thing", "-t")

可以通过短的选项。

PARSER.parse_args("-t some-thing".split())
Namespace(value=None, thing='some-thing')

或长选项。

PARSER.parse_args("--thing some-thing".split())
Namespace(value=None, thing='some-thing')

类型

有更多类型的参数可用。在默认情况下,最流行的两种类型是布尔型和计数型。布尔型参数有一个默认为真的变体和一个默认为假的变体。

PARSER.add_argument("--active", action="store_true")
PARSER.add_argument("--no-dry-run", action="store_false", dest="dry_run")
PARSER.add_argument("--verbose", "-v", action="count")

这意味着除非通过--active ,否则active 就是False ,除非通过--no-dry-run ,否则dry_run 就是True 。没有价值的短选项可以并列在一起。

传递所有的参数会导致一个非默认的状态。

PARSER.parse_args("--active --no-dry-run -vvvv".split())
Namespace(value=None, thing=None, active=True, dry_run=False, verbose=4)

默认状态有些不那么令人兴奋。

PARSER.parse_args("".split())
Namespace(value=None, thing=None, active=False, dry_run=True, verbose=None)

子命令

尽管经典的Unix命令 "做一件事,而且做得很好",但现代的趋势是做 "几个密切相关的动作"。

git,podman, 和kubectl 的例子可以说明这种范式是多么的流行。argparse 库也支持这种做法。

MULTI_PARSER = argparse.ArgumentParser()
subparsers = MULTI_PARSER.add_subparsers()
get = subparsers.add_parser("get")
get.add_argument("--name")
get.set_defaults(command="get")
search = subparsers.add_parser("search")
search.add_argument("--query")
search.set_defaults(command="search")
MULTI_PARSER.parse_args("get --name awesome-name".split())
Namespace(name='awesome-name', command='get')
MULTI_PARSER.parse_args("search --query name~awesome".split())
Namespace(query='name~awesome', command='search')

剖析一个程序

使用argparse 的一种方法是将程序结构化,如下所示。

## my_package/__main__.py
import argparse
import sys
from my_package import toplevel
parsed_arguments = toplevel.PARSER.parse_args(sys.argv[1:])
toplevel.main(parsed_arguments)
## my_package/toplevel.py
PARSER = argparse.ArgumentParser()
## .add_argument, etc.
def main(parsed_args):
    ...
    # do stuff with parsed_args

在这种情况下,运行命令是用python -m my_package 。或者,你也可以使用 console_scripts的入口点。

摘要

argparse 模块是一个强大的命令行参数分析器。还有很多功能在这里没有涉及。限制是你的想象力。