python - argparse 仅在位置参数之前解析
问题描述
我怎样才能让 argparse 只解析位置参数之后的命令?
Aka 如果我有命令pythonfile.py -d dir -e test pos_cmd_1 -d
我怎样才能拥有它,以便第一个-d
由 argparse 解析,而位置命令之后的任何内容都由该命令本身解析(pos_cmd_1 -d
基本上作为单个参数读取)
这样参数列表将是
- 蟒蛇文件.py
- -d 目录
- -e 测试
- pos_cmd_1 -d -s -etc
因此,位置命令之前的任何内容都是可选的。位置命令之后的任何内容都将成为位置命令本身的一部分。
编辑:当尝试使用双破折号运行命令时,它告诉我后面的参数无法识别。
pythonfile.py -d testdir -e test -- command -d -s
它说-d -s
是无法识别的参数,而不是将它们与命令捆绑在一起。
解决方案
使用简单的解析器:
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'])
带有REMAINDER
nargs 的位置似乎有效:
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