3

我正在创建一个脚本,它使用 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 inputfile 它将正常运行并在脚本中途找不到 inputString 的值时输出错误。如果我尝试: python script.py xxx ;输出是:

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

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

4

3 回答 3

7

您的问题是您正在指定nargs='?'. 从文档中:

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

如果你省略了nargs='?'then 参数将是必需的,argparse如果没有提供它会显示一个错误。action='store'if (默认)使用单个参数。

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

于 2012-11-01T10:42:38.963 回答
2

为我工作。

代码:

#!/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

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

于 2012-11-01T10:25:47.697 回答
1

它按预期工作inputString如果您运行它,则没有script.py inputfile(仅给出一个参数,但是inputString第二个参数)。

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

于 2012-11-01T10:43:47.463 回答