首页 > 解决方案 > argparse 仅在位置参数之前解析

问题描述

我怎样才能让 argparse 只解析位置参数之后的命令?

Aka 如果我有命令pythonfile.py -d dir -e test pos_cmd_1 -d

我怎样才能拥有它,以便第一个-d由 argparse 解析,而位置命令之后的任何内容都由该命令本身解析(pos_cmd_1 -d基本上作为单个参数读取)

这样参数列表将是

因此,位置命令之前的任何内容都是可选的。位置命令之后的任何内容都将成为位置命令本身的一部分。

编辑:当尝试使用双破折号运行命令时,它告诉我后面的参数无法识别。

pythonfile.py -d testdir -e test -- command -d -s

它说-d -s是无法识别的参数,而不是将它们与命令捆绑在一起。

标签: pythonargparseargv

解决方案


使用简单的解析器:

In [2]: p = argparse.ArgumentParser()
In [3]: p.add_argument('-d');
In [4]: p.add_argument('-e');
In [5]: p.parse_args('-d dir -e test pos_cmd_1 -d'.split())
usage: ipython3 [-h] [-d D] [-e E]
ipython3: error: argument -d: expected one argument

它尝试解析最后一个“-d”并遇到错误。 parse_known_args没有帮助。

使用 '-d' 和 '-e' 以外的字符串parse_known_args有效:

In [7]: p.parse_known_args('-d dir -e test pos_cmd_1 -s'.split())
Out[7]: (Namespace(d='dir', e='test'), ['pos_cmd_1', '-s'])

带有REMAINDERnargs 的位置似乎有效:

In [8]: a1 = p.add_argument('rest', nargs='...') # argparse.REMAINDER
In [9]: p.parse_args('-d dir -e test pos_cmd_1 -s'.split())
Out[9]: Namespace(d='dir', e='test', rest=['pos_cmd_1', '-s'])
In [10]: p.parse_args('-d dir -e test pos_cmd_1 -d'.split())
Out[10]: Namespace(d='dir', e='test', rest=['pos_cmd_1', '-d'])

REMAINDER应该像'--'一样工作,捕获输入以供另一个解析器或命令使用。

如果预计它会捕获整个命令行,它可能会出现问题,如下所示:

In [12]: p.parse_args('-s pos_cmd_1 -d'.split())
usage: ipython3 [-h] [-d D] [-e E] ...
ipython3: error: unrecognized arguments: -s

https://docs.python.org/3/library/argparse.html#nargs


推荐阅读