【发布时间】:2016-05-04 19:31:17
【问题描述】:
我正在尝试解析命令行参数,以使以下三种可能性成为可能:
script
script file1 file2 file3 …
script -p pattern
因此,文件列表是可选的。如果指定了-p pattern 选项,则命令行上不会有其他内容。以“用法”格式表示,它可能看起来像这样:
script [-p pattern | file [file …]]
我认为使用 Python 的 argparse 模块执行此操作的方法如下:
parser = argparse.ArgumentParser(prog=base)
group = parser.add_mutually_exclusive_group()
group.add_argument('-p', '--pattern', help="Operate on files that match the glob pattern")
group.add_argument('files', nargs="*", help="files to operate on")
args = parser.parse_args()
但是 Python 抱怨我的位置参数必须是可选的:
Traceback (most recent call last):
File "script", line 92, in <module>
group.add_argument('files', nargs="*", help="files to operate on")
…
ValueError: mutually exclusive arguments must be optional
但是argparse documentation 表示"*" 的参数nargs 意味着它是可选的。
我还没有找到任何其他可以解决问题的 nargs 值。我最接近的是使用nargs="?",但它只抓取一个文件,而不是任何数字的可选列表。
是否可以使用argparse 组合这种参数语法?
【问题讨论】:
-
有没有办法用“子解析器”来做到这一点? docs.python.org/2/library/argparse.html#sub-commands
-
不错的主意,@mac。子解析器似乎确实彼此独立运行。但是我对文档的快速阅读告诉我,调用哪个子解析器的选择是由较早的位置参数完成的。 (他们使用
svn命令的参数示例。)我没有任何可以在所需命令行参数中使用的选择机制。 -
是的,这似乎是一个主要限制;太糟糕了,不支持“默认”子解析器,当 args 不包含任何其他命名的子解析器时将使用该子解析器
标签: python command-line-arguments argparse