我想解析包含逗号分隔的整数列表所需的,位置参数。 如果第一个整数包含前导减号(“ - ”)的标志,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']
这样做的缺点是帮助文本会少一些信息。
文章来源: How to parse positional arguments with leading minus sign (negative numbers) using argparse