我正在创建一个脚本,它使用argparse获取位置和可选参数。我已经阅读了Doug的教程和python Docs,但找不到答案。
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]
任何人都可以解释为什么它不检查位置参数?
答案 0 :(得分:6)
您的问题是您指定的是nargs='?'
。来自the documentation:
'?'
。如果可能,将从命令行使用一个参数,并将其作为单个项生成。如果不存在命令行参数,则将生成默认值。
如果省略nargs='?'
,那么将需要参数,如果未提供,argparse
将显示错误。如果action='store'
(默认值),则会使用单个参数。
您还可以指定nargs=1
;不同之处在于,这会产生一个包含一个项目的列表,而不是项目本身。有关使用nargs
的更多方法,请参阅文档。
答案 1 :(得分: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
您是否忽略了参数列表中的第二行?
答案 2 :(得分:1)
It works as expected。如果以inputString
运行它,则没有script.py inputfile
(只给出一个参数,但inputString
是第二个参数)。
narg='?'
表示参数是可选的(它们在帮助消息中被[]
包围)。