【问题标题】:argparse doesn't check for positional argumentsargparse 不检查位置参数
【发布时间】:2012-10-21 21:59:40
【问题描述】:

我正在创建一个脚本,它使用 argparse 接受位置参数和可选参数。我浏览了 Doug 的教程和 python 文档,但找不到答案。

parser = argparse.ArgumentParser(description='script to run')
parser.add_argument('inputFile', nargs='?', type=argparse.FileType('rt'),
parser.add_argument('inputString', action='store', nargs='?') 
parser.add_argument('-option1', metavar='percent', type=float, action='store')
parser.add_argument('-option2', metavar='outFile1', type=argparse.FileType('w'),
parser.add_argument('-option3', action='store', default='<10',
args = parser.parse_args()
# rest of script.... blah blah

如您所见,我想要 2 个位置参数和 3 个可选参数。但是,当我尝试在终端中运行它时,它不会检查位置! 如果我尝试:python script.py 输入文件 当找不到 inputString 的值时,它将正常运行并在脚本中途输出错误。 如果我尝试: python script.py xxx ;输出是:

usage script.py [-h] [-option1] [-option2] [-option3]

谁能解释为什么它不检查位置参数?

【问题讨论】:

  • 如果你想让inputFile和`inputString成为必填参数,你为什么要设置nargs='?'
  • 好的,我尝试删除 nargs 并且成功了!我正在使用另一个示例,python 文档将 nargs 指定为使用 1 个参数。我使用它是为了使 args.inputFile 不会同时使用为 inputFile 和 inputString 提供的名称。那么现在这样说是否正确,您只将 nargs 用于可选参数?非常感谢!
  • 您也可以使用nargs='*'nargs='+' 用于多个参数;请参阅下面的答案和the documentation

标签: python argparse optional-arguments


【解决方案1】:

为我工作。

代码:

#!/usr/bin/python

import argparse

parser=argparse.ArgumentParser(description='script to run')

parser.add_argument('inputFile', nargs='?', type=argparse.FileType('rt'))
parser.add_argument('inputString', action='store', nargs='?') 
parser.add_argument('-option1', metavar='percent', type=float, action='store')
parser.add_argument('-option2', metavar='outFile1', type=argparse.FileType('w'))
parser.add_argument('-option3', action='store', default='<10')
args = parser.parse_args()

执行:

# ./blah.py -h
usage: blah.py [-h] [-option1 percent] [-option2 outFile1] [-option3 OPTION3]
               [inputFile] [inputString]

script to run

positional arguments:
  inputFile
  inputString

optional arguments:
  -h, --help         show this help message and exit
  -option1 percent
  -option2 outFile1
  -option3 OPTION3

您是否忽略了参数列表中的第二行?

【讨论】:

  • 哦,对了,我错过了用法 [-h] 中所述的最后两个位置参数。对不起这是我的错。感谢您指出。但是我仍然在没有第二个位置参数的情况下运行脚本时遇到问题。
  • 顺便说一句,有没有办法重新排列帮助显示,使其显示usage blah.py [inputFile] [inputString] [option1].....?谢谢!
  • 对不起,我在评论我的问题之前看到了你的回复。 @ecatmur 关于删除 nargs 的回复解决了我的问题。基本上,脚本可以在没有给出 inputString 的情况下使用 python blah.py inputFile 运行。
【解决方案2】:

您的问题是您指定了nargs='?'。来自the documentation:

'?'。如果可能,将从命令行使用一个参数,并将其作为单个项目生成。如果不存在命令行参数,则将生成默认值。

如果您省略了nargs='?',则该参数将是必需的,如果未提供argparse,则会显示错误。如果action='store'(默认值),则使用单个参数。

也可以指定nargs=1;不同之处在于这会生成一个包含一个项目的列表,而不是项目本身。请参阅文档了解更多使用 nargs 的方法。

【讨论】:

    【解决方案3】:

    It works as expected。如果以script.py inputfile 运行,则没有inputString(仅给出一个参数,而inputString 是第二个参数)。

    narg='?' 表示参数是可选的(在帮助消息中它们被[] 包围)。

    【讨论】:

      猜你喜欢
      • 2011-05-27
      • 2011-05-27
      • 1970-01-01
      • 2015-06-16
      • 2016-01-08
      • 2015-07-25
      • 2015-08-09
      相关资源
      最近更新 更多