如何使用argparse使用前导减号(负数)解析位置参数

Ina*_*ist 18 python command-line-arguments argparse

我想解析一个包含以逗号分隔的整数列表的必需的位置参数.如果第一个整数包含一个前导减号(' - '),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
Run Code Online (Sandbox Code Playgroud)

我见过人们建议除了-作为旗帜角色之外还使用其他一些角色,但我宁愿不这样做.是否有另一种方法来配置argparse以允许两个--test-1,2,3,4作为有效参数?

Mar*_*ers 27

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

$ python example.py --test -- -1,2,3,4
Namespace(positional='-1,2,3,4', test=True)
Run Code Online (Sandbox Code Playgroud)

双击阻止argparse寻找更多可选开关; 这是命令行工具正好处理这个用例的事实标准方法.

  • 那只是给了我`错误:无法识别的参数:--`(Python 2.7.3下的argparse) (2认同)

Bak*_*riu 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()
Run Code Online (Sandbox Code Playgroud)

输出:

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

获得你想要的东西的第三种方法是使用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
Run Code Online (Sandbox Code Playgroud)

结果:

$ python test.py  --test -1,2,3,4                                            
Namespace(test=True)
['-1,2,3,4']    
Run Code Online (Sandbox Code Playgroud)

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