在这种情况下如何访问可选参数?

时间:2013-10-10 07:30:55

标签: python argparse

在这种情况下如何访问可选参数?

我有一个像

这样的解析器
import argparse
parser = argparse.ArgumentParser(prog='some_prog',formatter_class=argparse.RawTextHelpFormatter)
parser.add_argument("tableName")
parser.add_argument("--duration",help = """It is an optional parameter.""")
parser.add_argument("columns",nargs=argparse.REMAINDER)
args = parser.parse_args()
print args.duration

当我使用命令提示符执行“python some_prog.py T1 --duration = 1278678-3275678678 column1 column2”时

args.duration返回无

如何访问“持续时间”?

请建议我解决方案......

如果我使用的方式是错误的,请告诉我?

2 个答案:

答案 0 :(得分:0)

您应首先放置可选参数:

python some_prog.py --duration=1278678-3275678678 T1 column1 column2

适合我。

T1将分配到tableName,而“column1 column2”将分配到columns

这是因为在获得位置参数tableName之后,其余部分将作为argparse.REMAINDER的一部分。

我记得在另一个SO问题中看到这个,但我找不到它。

为了能够将tableName作为第一个参数,您可以使用parse_known_args代替parse_args并删除column的定义:

import argparse
parser = argparse.ArgumentParser(prog='some_prog',formatter_class=argparse.RawTextHelpFormatter)
parser.add_argument("tableName")
parser.add_argument("--duration",help = """It is an optional parameter.""")

(args, the_rest) = parser.parse_known_args()
print args.tableName
print args.duration
print the_rest

将给出:

T1
1234
['column1', 'column2']

答案 1 :(得分:0)

生成的命名空间是:

Namespace(columns=['--duration=1278678-3275678678', 'column1', 'column2'], duration=None, tableName='T1')

columns抓住了所有内容,REMAINDER

如果我给它:"--duration=1278678-3275678678 T1 column1 column2",我得到:

Namespace(columns=['--duration=1278678-3275678678', 'column1', 'column2'], duration=None, tableName='T1')

我们将nargs=REMAINDER更改为nargs='*'。现在第一个案例给出了

error: unrecognized arguments: column1 column2

问题在于如何消耗可以采用零个或多个值的位置。请参阅此SO讨论:https://stackoverflow.com/a/18645430/901925 'Python argparse: Combine optional parameters with nargs=argparse.REMAINDER.

简而言之columns要么消耗T1之后的所有内容,要么消耗[]T1之间的--duration

将其更改为nargs='+',它有效。为什么?因为它必须匹配一个或多个字符串。现在它不适应差距。

在其他SO线程和Python错误(混合选项和位置)上引发了这个问题

但与此同时,你的选择是:

  • 在位置
  • 之前添加--duration之类的选项
  • 使用'+'代替'*'或'REMAINDER'
  • 分几步解析输入。