带有1或3个位置参数的python脚本

时间:2017-01-25 19:03:03

标签: python argparse

我正在编写一个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

3 个答案:

答案 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来增加参数的清晰度。 (如最近的另一个问题所述,metavarpositionals不兼容。)

另一种选择是使用subparsers。这仍然需要关键字setupname,只有在没有--的情况下输入。 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