我想解析一个必需的位置参数,该参数包含一个逗号分隔的整数列表。如果第一个整数包含前导减号('-'),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
都作为有效参数?
您需要在命令行参数中插入一个--
:
$ python example.py --test -- -1,2,3,4
Namespace(positional='-1,2,3,4', test=True)
双破折号停止argparse查找更多可选开关;这是命令行工具处理这个用例的实际标准方式。
来自文档:
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']
这样做的缺点是帮助文本的信息量较小。
我在另一篇文章中找到了这个,我想下次搜索如何解决这个问题时会更新它。
$ python example.py --test=-1,2,3,4
理论上应该有效,它对我来说是有效的,只需通过一个像这样的条目
$ python example.py --test=-1