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

使用 argparse 模块在您的 Python 应用程序中启用选项。
37 位读者喜欢这篇文章。
Python options

Image CC BY-SA Opensource.com

有几个用于命令行参数解析的第三方库,但标准库模块 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')

类型

还有更多类型的参数可用。除了默认类型外,最流行的两种类型是布尔型和计数型。布尔型带有默认为 true 的变体和默认为 false 的变体。

PARSER.add_argument("--active", action="https://open-source.net.cn/store_true")
PARSER.add_argument("--no-dry-run", action="https://open-source.net.cn/store_false", dest="dry_run")
PARSER.add_argument("--verbose", "-v", action="https://open-source.net.cn/count")

这意味着 activeFalse,除非传递了 --active,而 dry_runTrue,除非传递了 --no-dry-run。没有值的短选项可以并列放置。

传递所有参数会导致非默认状态

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 命令“做一件事,并做好它”,但现代趋势是做“几个密切相关的操作”。

gitpodmankubectl 的例子可以展示这种范式有多么流行。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 完成的。或者,您可以使用包的 setup 中的 console_scripts 入口点。

总结

argparse 模块是一个强大的命令行参数解析器。还有许多其他功能本文未涵盖。限制在于您的想象力。

下一步阅读
Moshe sitting down, head slightly to the side. His t-shirt has Guardians of the Galaxy silhoutes against a background of sound visualization bars.
Moshe 自 1998 年以来一直参与 Linux 社区,帮助举办 Linux“安装派对”。他自 1999 年以来一直编写 Python 程序,并为核心 Python 解释器做出了贡献。Moshe 在这些术语出现之前就已经是一名 DevOps/SRE,他非常关心软件可靠性、构建可重现性以及其他此类事情。

1 条评论

非常好的文章,Moshe!argparse 是我用来在 Python 中创建 CLI 的第一个工具。我现在已经转向 click (https://click.palletsprojects.com/en/8.0.x/),因为它抽象了很多样板代码,但是当我无法安装它时,我会再次回退到 argparse。

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© . All rights reserved.