Argparse仅在位置参数之前解析

时间:2018-07-14 07:54:02

标签: python argparse argv

我怎么能只解析位置参数后面的命令?

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

如何获取它,以便第一个-d由argparse解析,而位置命令之后的所有内容均由该命令本身解析(基本上将pos_cmd_1 -d读为单个参数)

这样参数列表将是

  • pythonfile.py
  • -d目录
  • -e测试
  • pos_cmd_1 -d -s -etc

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

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

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

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

2 个答案:

答案 0 :(得分:1)

您只需将命令行稍微更改为

pythonfile.py -d dir -e test -- pos_cmd_1 -d

通过添加--,您告诉argparse停止寻找选项。因此,所有其余参数都在位置参数列表中设置。

另一种方法是引用其余参数:

pythonfile.py -d dir -e test "pos_cmd_1 -d"

(由于它仅创建一个位置参数),并且对分割后的字符串再次使用参数解析器(如果要在这些args中传递带引号的字符串,则不理想)

这些方法的优点是argparsegetopt本身支持它们,而且这是一种标准的机制,不会令您的命令用户感到惊讶。

如果您想坚持自己的方法,也许可以通过在一行中检测2个非选项参数来预处理参数列表以插入双破折号:

args = "-d dir -e test pos_cmd_1 -d".split()
oldarg=""
for i,a in enumerate(args):
    if oldarg and oldarg[0]!='-' and a[0]!='-':
        args.insert(i,'--')
        break
    oldarg = a

args现在是:['-d', 'dir', '-e', 'test', '--', 'pos_cmd_1', '-d']

答案 1 :(得分:0)

使用简单的解析器:

[IS-HOME]/repository/database

它尝试解析最后一个'-d'并遇到错误。 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'和'-e'以外的其他字符串parse_known_args可以工作:

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']) nargs的位置似乎可以工作:

REMAINDER

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

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