【问题标题】:How to parse positional arguments with leading minus sign (negative numbers) using argparse如何使用 argparse 解析带有前导减号(负数)的位置参数
【发布时间】:2013-01-19 13:32:50
【问题描述】:

我想解析一个必需的位置参数,其中包含一个以逗号分隔的整数列表。如果第一个整数包含前导减号 ('-'),则 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 作为有效参数?

【问题讨论】:

  • 以防万一有人需要这个,如果 --test 接受参数,你可以这样做:python example.py --test=-1,2,3,4

标签: python command-line-arguments argparse


【解决方案1】:

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

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

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

【讨论】:

  • 啊,我不知道必须使用双破折号的“标准”(仍然是 *nix 新手,仍在学习...)感谢您提供信息!
  • 这只是给了我error: unrecognized arguments: --(Python 2.7.3 下的 argparse)
  • @panzi: Python 2.7.5下没有这样的问题。
【解决方案2】:

来自documentation

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']    

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

【讨论】:

  • 我看到了文档,但想知道是否有任何技巧可以改变标准行为。在这一点上,我认为要求四个单独的位置参数或使用空格分隔符比使用-- 转义机制更好。感谢您的帮助。
  • @Inactivist 我用第三种方法更新了我的答案以允许-1,2,3,4 样式定位。
猜你喜欢
  • 2018-12-22
  • 2013-01-24
  • 2020-11-10
  • 2021-01-10
  • 2012-06-21
  • 2017-02-23
  • 2015-11-07
  • 1970-01-01
相关资源
最近更新 更多