argparse不检查位置参数

jon*_*ave 2 python optional-arguments argparse

我正在创建一个脚本,它使用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
Run Code Online (Sandbox Code Playgroud)

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

usage script.py [-h] [-option1] [-option2] [-option3]
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释为什么它不检查位置参数?

eca*_*mur 6

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

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

如果省略,nargs='?'那么参数将是必需的,argparse如果没有提供,将显示错误.如果action='store'(默认值),则使用单个参数.

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