19

我想解析一个必需的位置参数,其中包含一个以逗号分隔的整数列表。如果第一个整数包含前导减号 ('-'),则 argparse 会抱怨:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('positional')
parser.add_argument('-t', '--test', action='store_true')
opts = parser.parse_args()
print opts

$ python example.py --test 1,2,3,4
Namespace(positional='1,2,3,4', test=True)

$ python example.py --test -1,2,3,4
usage: example.py [-h] [-t] positional
example.py: error: too few arguments

$ python example.py --test "-1,2,3,4"
usage: example.py [-h] [-t] positional
example.py: error: too few arguments

我见过人们建议使用除-标志字符之外的其他字符,但我宁愿不这样做。是否有另一种方法来配置 argparse 以允许同时--test作为-1,2,3,4有效参数?

4

2 回答 2

30

您需要在--命令行参数中插入 a:

$ python example.py --test -- -1,2,3,4
Namespace(positional='-1,2,3,4', test=True)

双破折号停止 argparse 寻找更多可选开关;这是为命令行工具准确处理此用例的事实上的标准方法。

于 2013-02-04T19:09:49.523 回答
8

文档中:

parse_args() 方法试图在用户明显犯错时给出错误,但有些情况本质上是模棱两可的。例如,命令行参数 -1 可能是尝试指定选项或尝试提供位置参数。parse_args() 方法在这里很谨慎:位置参数只能以 - 开头,如果它们看起来像负数并且解析器中没有看起来像负数的选项:

由于-1,2,3,4看起来不像负数,因此您必须使用--大多数 *nix 系统中的“转义”它。

另一种解决方案是使用nargs位置并将数字作为空格分隔传递:

#test.py
import argparse

parser = argparse.ArgumentParser()
parser.add_argument('positional', nargs='*') #'+' for one or more numbers

print parser.parse_args()

输出:

$ python test.py -1 2 3 -4 5 6
Namespace(positional=['-1', '2', '3', '-4', '5', '6'])

获得所需内容的第三种方法是使用parse_known_args而不是parse_args. 您不要将位置参数添加到解析器并手动解析它:

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--test', action='store_true')

parsed, args = parser.parse_known_args()
print parsed
print args

结果:

$ python test.py  --test -1,2,3,4                                            
Namespace(test=True)
['-1,2,3,4']    

这样做的缺点是帮助文本信息量较少。

于 2013-02-04T19:11:19.787 回答