我正在编写一个python脚本,它需要3个位置参数(名称,日期,位置,比方说)或1个参数,这是一个包含该信息的安装文件。
我知道我可以使用argparse
,我可以使位置参数可选:
parser.add_argument('name_OR_setupFile')
parser.add_argument('date', nargs='?')
parser.add_argument('location', nargs='?')
然后我可以进行错误检查,以确保用户没有做任何愚蠢的事情
问题是现在帮助信息会非常混乱,因为不清楚第一个参数到底是什么。我想用两种不同的add_argument行来做这个,不知何故,但我不确定如何。
我也知道我可以使用--setupFile
参数,并使三个可选...但我不想这样做,如果我不需要。
第三种选择是使用:
parser.add_argument('ARGS', nargs='+', help='ARGS is either of the form setupFile, or name date location')
然后再进行错误检查......
ETA澄清:
我希望能够使用以下任一方式调用脚本:
python foo.py setupFile
或
python foo.py name date location
我希望帮助文字类似于:
usage:
foo.py setupFile
foo.py name date location
答案 0 :(得分:3)
我认为使用argparse
的最清晰设计是:
parser = argparse.ArgumentParser()
g = parser.add_mutually_exclusive_group()
g.add_argument('--setup','-s',metavar='FILE',help='your help')
g.add_argument('--name',nargs=3,metavar=('NAME','DATE','LOCATION'),hel
...: p='your help')
parser.print_help()
产生:
usage: ipython3 [-h] [--setup FILE | --name NAME DATE LOCATION]
optional arguments:
-h, --help show this help message and exit
--setup FILE, -s FILE
your help
--name NAME DATE LOCATION
your help
我已经使用互斥1 or 3
处理了optionals
参数要求。并使用metavar
来增加参数的清晰度。 (如最近的另一个问题所述,metavar
与positionals
不兼容。)
另一种选择是使用subparsers
。这仍然需要关键字setup
和name
,只有在没有--
的情况下输入。 subparsers的帮助结构完全不同。
答案 1 :(得分:1)
不完全确定这是你的意思,但如果我理解正确的话:
if __name__ =='__main__':
def dem_args(*args):
if len(args) == 1:
if os.path.isfile(args[0]):
#go file
else:
#error regarding this being a bad filename or nonexistent file
elif len(args) == 3:
#try to process / raise errors regarding name, date, location
else:
#error reg. wrong number of arguments, possible arguments are either this or that
答案 2 :(得分:0)
好的,这就是我目前正在做的事情。我把它放在这里供人们发表评论,如果它最终有用,为了子孙后代。
我实际上是在解决另一个问题。问题实际上比我指定的要复杂一点。因为实际上有3种方式来运行程序,我希望能够有一个--help选项,只给我一种类型的详细信息。所以我想-h,-h 1和-h 2都做不同的事情。
我目前的代码是:
import argparse
baseParser = argparse.ArgumentParser(add_help=False)
baseParser.add_argument('-f', '--foo', help ='foo argument')
baseParser.add_argument('-h', '--help', nargs='?' , const = 'all')
parser1 = argparse.ArgumentParser(parents = [baseParser], add_help=False)
parser1.add_argument('name', help='name argument (type 1)')
parser1.add_argument('date', help='date argument')
parser1.add_argument('location', help='location argument')
setupParser=argparse.ArgumentParser(parents = [baseParser],add_help=False)
setupParser.add_argument('setup', help='setup file')
parser2 = argparse.ArgumentParser(parents = [baseParser],add_help=False)
parser2.add_argument('name', help='name argument (type 2)')
parser2.add_argument('baa', help='sheep?')
realParser = argparse.ArgumentParser(parents=[baseParser], add_help=False)
realParser.add_argument('ARGS', nargs = '*', help = 'positional arguments')
args = realParser.parse_args()
if args.help:
if args.help == 'all':
print 'This product can be used in multiple ways:'
print 'setup'
setupParser.print_usage()
print 'type1'
parser1.print_usage()
print'type2'
parser2.print_usage()
print 'use help [type] for more details'
elif args.help=='setup':
setupParser.print_help()
elif args.help=='1':
parser1.print_help()
else:
parser2.print_help()
exit(0)
#actually parse the args in args.ARGS, and work with that