可以使用不带任何标志的argparse吗?

时间:2018-12-20 15:24:08

标签: python python-3.x windows argparse

是否可以使用没有任何标志的argparse

例如,每当没有提供标志(在这种情况下为-u-i)时,我希望脚本将第一个参数sys.argv[1]作为IP地址进行处理。

代码

import argparse, sys

parser = argparse.ArgumentParser()

parser.add_argument('-u')
parser.add_argument('-i')

args = parser.parse_args()

if args.i:
    print("IP Address is " + args.i)
elif args.u:
    print("URL is " + args.u)
elif len(sys.argv) > 1: 
    print("IP Address is " + sys.argv[1])
else: 
    print("No arguments ")

正常输出

C:\>python script.py
No arguments

C:\>python script.py 8.8.8.8
usage: script.py [-h] [-u U] [-i I]
script.py: error: unrecognized arguments: 8.8.8.8

C:\>python script.py -i 8.8.8.8
IP Address is 8.8.8.8

C:\>

即使没有提供标志(-u-i),我的期望输出。

C:\>python script.py 8.8.8.8
IP Address is 8.8.8.8

C:\>python script.py -i 8.8.8.8
IP Address is 8.8.8.8

如果有更好的选择,请告诉我。

2 个答案:

答案 0 :(得分:4)

您可以使用ArgumentParser.parse_known_args()

import argparse
parser = argparse.ArgumentParser()

parser.add_argument('-u')
parser.add_argument('-i')

args, ip = parser.parse_known_args()

if args.i:
    print("IP Address is " + args.i)
elif args.u:
    print("URL is " + args.u)
elif ip:
    print("IP Address is " + ip[0])
else:
    print('No argument provided')

此方法的缺点是它不会显示在帮助中(除非您将其包括在某个地方或修改HelpFormatter)。


另一种解决方案是将互斥组与使用nargs='?'的位置参数一起使用:

import argparse, sys

parser = argparse.ArgumentParser()

parser.add_argument('-u')
group = parser.add_mutually_exclusive_group()

group.add_argument('-i')
group.add_argument('ip', nargs='?')

args = parser.parse_args()

if args.i:
    print("IP Address is " + args.i)
elif args.ip:
    print("IP Address is " + args.ip)
elif args.u:
    print("URL is " + args.u)
else:
    print('No argument provided')

因此,当尝试同时指定位置参数和-i时,会出现错误:

$ script.py 2.3.4.5 -i 1.2.3.4
usage: script.py [-h] [-u U] [-i I | ip]
p.py: error: argument -i: not allowed with argument ip

这将显示您可以使用-i IP或位置参数,尽管对于不习惯命令行的人来说,语法可能有点难以理解:

$ script.py -h
usage: script.py [-h] [-u U] [-i I | ip]

positional arguments:
  ip

optional arguments:
  -h, --help  show this help message and exit
  -u U
  -i I

答案 1 :(得分:1)

您可以执行以下操作:

import argparse

parser = argparse.ArgumentParser()

parser.add_argument('-i', dest='type', action='store_const',
                    const='ip', default='ip')
parser.add_argument('-u', dest='type', action='store_const',
                    const='url')

parser.add_argument('location', nargs='?', default=None)

args = parser.parse_args()

if args.location is not None:
    if args.type == 'ip':
        print("IP Address is " + args.location)
    elif args.type == 'url':
        print("URL is " + args.location)
else:
    print("No argument provided")

在这里,我们使用选项来指定类型并将位置设为必需的参数。该类型将默认为ip,因此会提供您所需的默认行为,但您可以同时使用-i-u来更明确。